我使用Ruby 1.8.7和2.3.2軌道避免sql注入的最佳方式是什麼?
下面的代碼很容易受到SQL注入
params[:id] = "1) OR 1=1--"
User.delete_all("id = #{params[:id]}")
我的問題是通過執行以下操作將是最好的解決辦法,以避免SQL注入或不。如果不是,那麼最好的辦法是什麼?
User.delete_all("id = #{params[:id].to_i}")
我使用Ruby 1.8.7和2.3.2軌道避免sql注入的最佳方式是什麼?
下面的代碼很容易受到SQL注入
params[:id] = "1) OR 1=1--"
User.delete_all("id = #{params[:id]}")
我的問題是通過執行以下操作將是最好的解決辦法,以避免SQL注入或不。如果不是,那麼最好的辦法是什麼?
User.delete_all("id = #{params[:id].to_i}")
什麼:
User.where(id: params[:id]).delete_all
爲Rails好難過2.X其:
User.delete_all(["id = ?", params[:id]])
順便說一句,一定要使用delete_all
而不是destroy_all
,前者不會觸發回調。
您可以使用此也
User.delete(params[:id])
使用軌道的方法來傳遞你的where
選項。你總是可以硬編碼他們,在你給的例子,但通常的方法是這樣的:
User.where(:id => params[:id]).delete_all
User.where("id = ?", params[:id]).delete_all
User.where("id = :id", :id => params[:id]).delete_all
它們是行之有效的,並在情況下,檢測到新的漏洞,更新將解決這個問題,你的代碼不需要改變。
順便說一句,如果你只是想根據ID刪除1分的記錄,我會做的是:
User.find(PARAMS [:編號])。破壞
我使用的是舊版本... – 2014-10-21 04:28:39
其他的答案爲Rails回答這個問題,如果你遵循他們的建議,它會正常工作。在更通用的設置中,當您必須自己處理時,通常可以使用正則表達式來提取預期格式的值。這對於整數ID非常簡單。你可以這樣想:
if params[:id] =~ /(\d+)/
safe_id = $1.to_i
# do something with safe_id now
end
當你處理字符串和任意數據時,這會變得更復雜一些。如果您必須處理此類數據,則可以使用數據庫適配器可用的引用方法。在Rails,這是最終滾入了一致的接口:
safe_string = ActiveRecord::Base.connection.quote(unsafe_string)
對於大多數數據庫系統,這將在一個特殊的方式來處理單引號和反斜線。
如果您在Rails之外,您將不得不使用特定於數據庫適配器的引用方法,但使用方式非常相似。
外賣:
謝謝。我想這是避免sql注入的最好方法。使用to_i有什麼缺點嗎? – 2014-10-21 04:27:56
不是特別的,但我沒有看到這個paeudo驗證要麼 – apneadiving 2014-10-21 05:37:37
我的意思是,Rails處理這個給你,所以不污染你的代碼 – apneadiving 2014-10-21 05:41:43