4

我使用ASP經典和SQL Server 2000來創建動態網站。ASP經典 - Recordset對象與Command對象

我對何時使用記錄集對象以及何時在查詢數據庫時使用命令對象有點困惑。

我被告知如果存儲過程將從SELCT語句返回記錄,那麼我應該使用記錄集,但是如果我正在更新或插入,那麼我應該使用命令對象並將所有數據作爲參數傳遞給存儲過程。

當使用記錄我經常傳遞任何所需的數據,像這樣:

rs.Source = "spTest " & id 

我送花兒給人驗證我傳遞,以確保它是什麼,我期待和它轉換爲它的正確類型的數據。

我已經被告知但是上面的方法讓我的代碼對SQL注入攻擊開放,並且我應該總是使用一個命令對象。

這是正確的嗎?

謝謝

回答

3

是的,沒錯。

想象有人傳遞字符串:0;從用戶刪除*;'然後

您查詢的是:

spTest 0; delete * from users; 

如果幸運的話,你不會有一個用戶表。就我個人而言,我會一直使用命令對象來保持一致性。你可以從它得到你需要的一切。

下面是如何可以用該命令的對象做一個簡單的例子:

Dim oStoredProc : Set oStoredProc = Server.CreateObject("ADODB.Command") 

    With oStoredProc 
     .ActiveConnection = oDBConnection 
     .CommandType = adCmdStoredProc 
     .CommandText = "up_procname" 
     .Parameters.Append(.CreateParameter("@Param1", ADODB.adInteger, ADODB.adParamInput, 22, 11)) 
     .Parameters.Append(.CreateParameter("@Param2", ADODB.adInteger, ADODB.adParamOutput, 22, 12) 

     Call .Execute() 

     myVal = .Parameters("@Param2") 
    End With 

    Set oStoredProc = Nothing 
+0

謝謝。 這樣說,就像我給出的例子一樣,我知道參數將是數字,並且我已驗證輸入以確保它是。按照我所描述的方式使用記錄集對象會好嗎,還是應該使用命令對象?我只問很多時間,只有數值是我經歷的,如果我不必經歷和改變它們,它會爲我節省很多時間。 謝謝 – chester600 2010-08-06 14:56:25

1

你被告知什麼是確實是正確的:你應該總是使用COMMANDE對象,以防止SQL注入。使用參數化查詢,您將所有的安全和參數的ADO層(雖然你還是應該做自己適當的驗證)驗證,你甚至可能會得到一些性能改進(這些參數化查詢由SQL Server緩存)

當你執行一個命令,你有兩個選擇:要麼你的SQL執行返回行(SELECT語句,或者一些存儲過程),那麼你必須使用記錄來存儲這些行,要麼不不(更新,刪除,其他程序),那麼你有理由執行命令,不用擔心記錄集。

編輯:只是爲了確保一切都清楚了你,我用詹姆斯·懷斯曼的代碼上面,它適用於你的例子:

Dim oStoredProc : Set oStoredProc = Server.CreateObject("ADODB.Command") 

With oStoredProc 
    .ActiveConnection = oDBConnection 
    .CommandType = adCmdStoredProc 
    .CommandText = "spTest ?" 
    .Parameters.Append(.CreateParameter("id", ADODB.adInteger, ADODB.adParamInput, id, 11)) 
    Dim rs : Set rs = .Execute() 
End With 

Set oStoredProc = Nothing 

沒有測試,但是應該是確定:-)

最後但並非最不重要的:即使你現在保護得很好,不要忘記,如果你在你的存儲過程中使用動態SQL,你可能仍然有一個SQL注入安全漏洞(只要你連接字符串來創建SQL你可能會容易我會說)!

+0

謝謝。那麼我是否應該只將記錄集對象與命令obbject結合使用? 我還假設在運行一個不需要傳遞參數的存儲過程時使用記錄集對象是可以的? 謝謝 – chester600 2010-08-06 14:59:43

+0

爲了使事情更簡單,我鼓勵你總是使用相同的方法:只要總是使用Recordsets與Command對象,不要再考慮它了。 有時您可能需要更多一些類型的鍵入,但可以使用一些可以編寫的幫助程序函數輕鬆避免此問題(您將很快會看到哪些代碼總是重複) – 2010-08-06 15:09:39

相關問題