題:
防止SQL注入的最佳做法?
Mark Davidson
2010-12-21 01:56:34 UTC
view on stackexchange narkive permalink

SQL注入一直是熱門話題,尤其是在涉及Web安全時。在這方面,我感興趣的是應該採取哪些步驟來防止在任何Web應用程序中進行SQL注入?除了這些正常步驟之外,人們還有其他措施可以阻止它嗎?

七 答案:
Chris Dale
2010-12-21 19:41:49 UTC
view on stackexchange narkive permalink

在這個問題上已經有很好的答案,但是我想再提一些:

  • 安全編碼(許多人已經提到過)
    • 使用戶轉義輸入
    • 參數化查詢(準備好的語句,僅綁定變量的預定義查詢)
    • 防禦性代碼
  • 監視攻擊
    • 網絡入侵檢測系統(NIDS)
    • 主機入侵檢測系統(HIDS)
    • 應用入侵檢測系統(AppIDS)
  • 阻止攻擊
    • 應用防火牆
    • 數據庫防火牆
    • Web應用防火牆
      • Apache ModSecurity
      • Cisco應用程序速度系統(AVS)
  • 針對漏洞的探針
    • 自動黑盒注入測試
    • 靜態源代碼分析
    • 手動滲透測試

這僅用於預防,而我沒有採取 sql服務器強化。但是有很多相似之處。

在您已經很容易受到注入攻擊的情況下的其他防禦措施是:

  • 以最少的必要授權數量運行應用程序
    • 專門僅授予訪問權限到所需的數據庫和表
    • 確保僅授予所需的特權(通常是選擇,插入,更新)
+1,很好的答案。不過,請在最後一段寫一個評論-最好不要直接在表上授予* any *訪問權限,而應使用存儲過程並僅授予對它們的訪問權限。
Weber
2010-12-21 02:02:13 UTC
view on stackexchange narkive permalink

準備好的語句,參數化查詢,轉義所有用戶輸入的內容,對於一個好的入門者來說,請參見 http://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

優秀的鏈接。可能會在答案正文中出現核心要點-這使某人更容易找到內容,並使此問答的搜索引擎索引更好。
我同意@Rory-您能在答案中添加更多信息嗎?特別是對存儲過程的一些引用-我沒有其他人提到過這一點...
-1
@symcbean-我猜從語義上講是對的,但通常“準備好的語句”是在應用程序中引用的,而不是在數據庫中引用的。
Justin Clarke
2010-12-21 16:53:44 UTC
view on stackexchange narkive permalink

主要的防禦措施是僅使用安全逃避數據庫查詢的API-這些通常稱為參數化或準備好的語句。並非在所有情況下都可以使用它們(例如,在運行時提供表或列名之類的SQL標識符),但在可能的情況下(大多數情況下),這是最好的方法。

注意-這可能導致有害數據被放入數據庫中,因此請注意在應用程序中其他位置使用此數據時

第二個防禦措施是採用轉義方法。這是“用兩個引號替換一個單引號”的方法。如果您需要這樣做,則必須轉義每個可能有害的字符,這在某些情況下意味著不僅僅是單引號。我建議如果可能的話,使用更高級別的庫,例如OWASP ESAPI,或者仔細閱讀OWASP SQL注入備忘單(上文參考)。

bretik
2010-12-21 17:07:42 UTC
view on stackexchange narkive permalink

的基本知識,保護Web應用程序免受SQL注入的主要步驟是正確清理任何用戶輸入(尤其是在SQL查詢中使用的輸入)。在某些語言/框架中,存在處理這些值的標準方法-例如,使用參數化查詢而不是通過聯接字符串值來構成查詢。

anonymous
2010-12-21 02:36:59 UTC
view on stackexchange narkive permalink

從Web開發人員的角度,應該注意Weber已經提到的內容。

此外,可以設置數據庫防火牆,例如GreenSQL: http://www.greensql.net/。它就像您的應用程序和用戶輸入之間的代理一樣工作,監視應該傳遞的內容等。但是,這會增加響應時間。

很酷-以前從未聽說過greenSQL。
Kim Stacks
2011-01-18 22:19:28 UTC
view on stackexchange narkive permalink

我正在教授理工學院的IT安全性。通常,對於學生來說,他們對用於SQL注入的術語有些困惑,所以讓我嘗試澄清一下。普通的Web用戶在數據字段中輸入SQL代碼,例如,在登錄表單的文本框中輸入

 'OR'1'='1。 

最佳人選防止SQL注入是Web開發人員,也就是負責為Web應用程序編寫代碼以將數據讀/寫到數據庫的人。

防止Web開發人員進行SQL注入的最簡單方法是使用參數化查詢。

準備好的語句和參數化查詢是同一回事。

從現在開始,我將使用參數化查詢。

參數化查詢是指首先定義SQL代碼,然後將數據放置在適當參數內的方式。 name` = @name其中id = @id

@name參數和@id是數據。其餘的是SQL代碼。

請記住,參數化查詢通常是 ,但並非總是 是在Web應用程序代碼中完成的。

有2種常見的編寫參數化查詢的方法。

  1. 在Web應用程序代碼中,具體取決於所使用的語言
  2. 在數據庫中使用存儲過程
  3. ol>

    從某種意義上講,是的存儲過程是參數化查詢的一種形式。

    還有其他防止SQL注入的方法,即轉義單引號等特殊字符。例如,在PHP中,您可以使用mysql_real_escape_string,它基本上只在單引號前加上斜杠。有關更多詳細信息,請參見此pdf

    長話短說,建議的所有選項都與清理(清理)用戶輸入有關,以清理SQL代碼。

    最好的方法是根據所使用的編程語言使用參數化查詢。 / p>

    故事結尾。

yfeldblum
2011-01-19 08:22:05 UTC
view on stackexchange narkive permalink

使用體面的數據訪問API,可以輕鬆安全地執行正確的操作。

這裡是ActiveRecord v3:

 #基本用法@user =用戶。 where(:username = >'joe@example.com')。first#具有SQL字符串片段,但使用parameters @ projects = @ user.projects.where('status =?',params [:status]) 


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 2.0許可。
Loading...