2012-05-30 111 views
4

我有串狀"User.first"有沒有辦法到字符串轉換爲ActiveRecord的查詢:字符串轉換爲ActiveRecord的查詢

User.first 

此字符串可以是任何東西,我想使其可執行。

+4

顯而易見的解決方法是使用'eval',但是這會帶來整個安全問題。特別是因爲它似乎是用戶輸入 - 是嗎? –

+0

所以問題是,它總是「model.classmethod」?以及這個字符串來自哪裏?可靠的消息來源?爲什麼看起來像Ruby代碼而不是某種數據結構? – tokland

回答

1

kernel#eval文檔:

與eval(String [,結合[,文件名[,LINENO]]])→OBJ點擊展開 源代碼

以字符串形式評估Ruby表達式。如果給出綁定,那麼 必須是Binding對象,評估在其上下文中執行。 如果存在可選的文件名和lineno參數,則會在報告語法錯誤時使用 。

但是,正如@andrew-marshall正確指出的那樣,如果您使用任何未經驗證的輸入類型,這是一個巨大的安全漏洞。請參閱Locking Ruby in the Safe作爲更多關於受污染數據和$ SAFE等級信息的起點。

3

你可以用某事嘗試像

Kernel.const_get("User").send('first') 
+1

這仍然需要先解析字符串,所以它沒有真正解決OP的問題。 –