快速提問...我必須使用相當多的遺留ASP代碼,我正在清理它們,並且它們都使用容易受SQL注入攻擊的查詢。我有一個庫,我放在一起用參數化查詢替換它們,我想知道在以下方法之間是否存在與安全角度不同的差異。方法1:這是大多數參數對象單獨構建並添加到Command對象的示例中顯示的方法。 Here's an example from another question。ADO Command.Execute帶有數組參數和SQL注入
方法2:對參數值數組使用Command.Execute方法。示例:
Command.CommandText = "select foo, bar from baz where a = ? and b = ?"
Command.Execute , Array(1, "BBB")
是的,執行的第一個參數被忽略。
第一種方法使用所有指定的類型,大小等構建每個參數,並且它需要與數據庫匹配。但是,如果一切都不「完美」,我總是會遇到這種方法的困難,奇怪的錯誤等等。所以我更喜歡後者,它實際上更符合我的編碼風格很多,因爲我可以將DB邏輯封裝到一個類中,並根據需要傳遞數組,而不必使用大量的數據庫調用拋棄我的代碼。
set rs = DB.Query("select foo, bar from baz where a = ? and b = ?", Array(1, "BBB")
或者::
set rs = DB.Query("select foo, bar from baz", empty)
(傳遞關鍵字空來表示該參數不使用)
使用我的包裝DB.Query方法的方法#2實施例
鑑於這一點,我想知道:方法#2仍然是安全的SQL注入攻擊?
謝謝。
編輯對執行的調用是錯誤的,並從內存寫入,它已被更正。
從這裏取得(http://msdn.microsoft.com/en-us/library/ms808187.aspx)看起來參數數組被封裝到命令的Parameters對象中。但似乎你不能使用SQL語句作爲Execute的第一個參數?還是這樣工作? – ulluoink
不,你是絕對正確的,當我從記憶中寫下時,我感到很疲倦。我的包裝就是這樣做的,即DB.Query(「select ...」,Array(1,「BBB」)),並將其正確轉換爲Command.Execute調用。我會更新問題以反映正確的語法。感謝您指出了這一點。 – Dave