2013-08-22 29 views
2

快速提問...我必須使用相當多的遺留ASP代碼,我正在清理它們,並且它們都使用容易受SQL注入攻擊的查詢。我有一個庫,我放在一起用參數化查詢替換它們,我想知道在以下方法之間是否存在與安全角度不同的差異。方法1:這是大多數參數對象單獨構建並添加到Command對象的示例中顯示的方法。 Here's an example from another questionADO 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注入攻擊?

謝謝。

編輯對執行的調用是錯誤的,並從內存寫入,它已被更正。

+0

從這裏取得(http://msdn.microsoft.com/en-us/library/ms808187.aspx)看起來參數數組被封裝到命令的Parameters對象中。但似乎你不能使用SQL語句作爲Execute的第一個參數?還是這樣工作? – ulluoink

+0

不,你是絕對正確的,當我從記憶中寫下時,我感到很疲倦。我的包裝就是這樣做的,即DB.Query(「select ...」,Array(1,「BBB」)),並將其正確轉換爲Command.Execute調用。我會更新問題以反映正確的語法。感謝您指出了這一點。 – Dave

回答

2

從我的視線:是的。

我寫了一個快速的例子,然後用Visual Studio進行調試。在

Command.Execute , Array(1, "BBB") 

之後ADODB.Command的Parameters對象正確填充了來自Array的給定值。參數的數據類型和長度已正確設置。

所以我認爲這種方法和方法#1一樣安全(使用手動創建的Parameters對象)。

+0

謝謝。當你說你用VS進行調試時,是調試一個經典的ASP腳本?如果是的話你是怎麼做到的?我有VS 2010在工作,不能創建一個經典的ASP項目,當我將腳本拖入IDE時,沒有選項可以在本地運行或調試它。如果我可以在本地運行它,這將改變我現在如何使用它的一切。現在我使用強化文本編輯器在服務器上工作。謝謝! – Dave

+0

@Dave是的,我在我的機器上本地運行它在IIS中。我在我的asp腳本中使用「stop」關鍵字來設置斷點。但有一些先決條件。您必須在您的iis中爲asp啓用服務器端調試等等。 – ulluoink