2011-06-30 25 views
2

我一直在尋找如何最好地防止在PHP/MySQL的SQL注入的不僅僅是使用庫MySQLi/MySQL的世外桃源讀了這篇Is mysql_real_escape_string enough to Anti SQL Injection?在PHP中使用預準備語句/存儲過程時,如何防止SQL注入?

我已經看到了這個很好的線程How can I prevent SQL injection in PHP?

我用在桌面/內部工具上做很多MS SQL服務器的東西,我們總是編寫存儲過程來防止這種情況,所以我在PHP/mysql上使用PDO讀取相應的內容http://php.net/manual/en/pdo.prepared-statements.php

在上面的代碼行中:

準備語句的參數不需要引用;驅動程序自動處理這個。如果應用程序獨佔使用預準備語句,開發人員可以確保不會發生SQL注入(但是,如果正在使用未轉義的輸入構建查詢的其他部分,則仍然可以執行SQL注入)。

我一直在相信PDO確實可以防範SQL注入攻擊,所以任何人都可以提供一個PDO不足以從安全角度考慮的實例嗎?

回答

3

您仍然可以從內部使用PREPARE語法(在MySQL中)創建動態SQL語句的存儲過程獲取SQL注入。

這些都需要非常小心,必要時使用QUOTE()。

理想情況下,我們不應該需要準備使用的存儲程序,但在某些情況下,它變得非常難以避免:

  • 此前的MySQL 5.5,LIMIT子句不能使用非恆定值。
  • IN()子句中使用的列表不能被(明智地)參數化,因此如果使用此模式,則需要使用動態SQL
  • 有時需要使用動態生成的ORDER BY子句。

在有必要準備使用的話,那麼我會建議,按優先順序:

  • 如果事情是一個INT型(等)是不易受SQL注入影響,您可以將該值放入查詢中而不會出現問題(例如,對於LIMIT)
  • 可以在EXECUTE之前將字符串值放入@variable中,或者傳遞給EXECUTE子句
  • 需要檢查列表值(例如IN())的有效性。
  • 最後,可以使用QUOTE()引用字符串值,這在某些情況下可能有用
1

這不是您使用的結構(存儲過程,準備好的語句等),但是您是否在任何時候使用未檢查的用戶輸入將SQL連接在一起。例如,您可以在存儲過程中執行動態SQL,在這種情況下危險仍然存在。

最簡單的方法(從注入迴避的角度來看)是使用帶有綁定變量的SP或PS:這些不需要檢查,因爲它們將被識別爲要在預定義的佔位符中執行的值。

相關問題