Asp.net
參數真的足以防止 Sql 注入嗎?
我一直在向我的同事和這裡宣講在 SQL 查詢中使用參數的好處,尤其是在 .NET 應用程序中。我什至承諾他們會提供對 SQL 注入攻擊的免疫力。
但我開始懷疑這是否真的是真的。是否有任何已知的 SQL 注入攻擊可以成功針對參數化查詢?例如,您可以發送一個導致伺服器緩衝區溢出的字元串嗎?
當然,還有其他考慮因素可以確保 Web 應用程序是安全的(比如清理使用者輸入和所有這些東西),但現在我正在考慮 SQL 注入。我對針對 MsSQL 2005 和 2008 的攻擊特別感興趣,因為它們是我的主數據庫,但所有數據庫都很有趣。
編輯:澄清我所說的參數和參數化查詢的意思。通過使用參數,我的意思是使用“變數”而不是在字元串中建構 sql 查詢。
所以不要這樣做:
SELECT * FROM Table WHERE Name = 'a name'我們這樣做:
SELECT * FROM Table WHERE Name = @Name然後在查詢/命令對像上設置@Name 參數的值。
佔位符足以防止注射。您可能仍然對緩衝區溢出持開放態度,但這是與 SQL 注入完全不同的攻擊方式(攻擊向量不是 SQL 語法,而是二進制)。由於傳遞的參數都將被正確轉義,因此攻擊者無法傳遞將被視為“實時”SQL 的數據。
您不能在佔位符中使用函式,也不能將佔位符用作列名或表名,因為它們被轉義並引用為字元串文字。
但是,如果您在動態查詢中使用參數作為字元串連接的一部分,您仍然容易受到注入的影響,因為您的字元串不會被轉義,而是文字。使用其他類型的參數(例如整數)是安全的。
也就是說,如果您使用 use 輸入來設置類似 的值
security_level,那麼有人可以讓自己成為您系統中的管理員,並且可以免費使用。但這只是基本的輸入驗證,與 SQL 注入無關。