我使用on Rails的3.2.11在Mac添加附加條件中的Rails 3 find_by_id
我有這樣的語句正常工作:
object= Object.find_by_id(params[:id])
我試圖加條件,所以我這樣做:
object = Object.where("id = :id AND level <= :level",{:id => params[:id], :level => current_user.level})
這種方法會有任何風險?任何替代品?
我使用on Rails的3.2.11在Mac添加附加條件中的Rails 3 find_by_id
我有這樣的語句正常工作:
object= Object.find_by_id(params[:id])
我試圖加條件,所以我這樣做:
object = Object.where("id = :id AND level <= :level",{:id => params[:id], :level => current_user.level})
這種方法會有任何風險?任何替代品?
只要ActiveRecord繼續堅持消毒輸入合同,本聲明就沒有風險。另一種選擇是一個範圍,但這實際上只是用不同的語法來做同樣的事情。
你可以做的一件事是set a default scope,它定義了level
限制,那麼你可以做一個標準的find_by_id
。但是,如果這是不可取的,只要使用正確的語法:
Object.where(id: params[:id], level: current_user.level)
是沒有風險的,但它的定義方式是不容易理解。
簡單的聲明將工作:
object = Object.where("id = ? AND level <= ?",{params[:id], current_user.level})
只要你讓鐵軌處理你的價值觀的消毒,你不會有任何問題。我的意思,這是運行使用用戶輸入軌SQL命令像
Object.where("id = #{params[:id]} AND level <= #{current_user.level}")
將容易受到SQL注入
它看起來像誰低估了我沒有得到我的意圖。我試圖說,上面的代碼易受sql注入的影響。 – 2013-02-08 08:42:28
它的工作原理。但是,當我使用它時,一些方法變得未定義。有什麼我做錯了嗎? –
您的語法錯誤。檢查更新的答案。 –