2014-10-20 83 views
0

我使用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}") 

回答

2

什麼:

User.where(id: params[:id]).delete_all 

爲Rails好難過2.X其:

User.delete_all(["id = ?", params[:id]]) 

Check doc

順便說一句,一定要使用delete_all而不是destroy_all,前者不會觸發回調。

+0

謝謝。我想這是避免sql注入的最好方法。使用to_i有什麼缺點嗎? – 2014-10-21 04:27:56

+0

不是特別的,但我沒有看到這個paeudo驗證要麼 – apneadiving 2014-10-21 05:37:37

+0

我的意思是,Rails處理這個給你,所以不污染你的代碼 – apneadiving 2014-10-21 05:41:43

1

您可以使用此也

User.delete(params[:id]) 
0

使用軌道的方法來傳遞你的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 [:編號])。破壞

+0

我使用的是舊版本... – 2014-10-21 04:28:39

1

其他的答案爲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之外,您將不得不使用特定於數據庫適配器的引用方法,但使用方式非常相似。

外賣:

  1. 如果你的數據有一個特定的格式,執行格式用正則表達式
  2. 否則,使用你的數據庫適配器的報價功能,使數據的「安全」裝置中使用查詢
  3. 如果您正確使用各種方法和「條件」,Rails將爲您處理大部分問題
相關問題