2013-03-28 65 views
0

我想通過參數化SQL語句使一個經典的ASP/VBScript網站更安全。

我有以下功能:如何在ADODB.RecordSet中使用ADODB.CommandObject?

Function OpenUpdateableRS(strSQL) 
    Dim rs 
    Set rs = Server.CreateObject("ADODB.Recordset") 
    rs.Open strSQL, cnDZ, adOpenKeyset, adLockPessimistic, adCmdText 
    Set OpenUpdateableRS = rs 
    Set rs = Nothing 
End Function

我打算把它轉換成類似:

Function SecureOpenUpdateableRS(strSQL, strParam1, strParam2) 
    Dim rs 
    Dim cmdOB 
    Set cmdOB = Server.CreateObject("ADODB.CommandObject") 
    With cmdOB 
     .ActiveConnection = cnDZ 
     .CommandText = strSQL 
     .Parameters(0).value = strParam1 
     .Parameters(0).value = strParam2 
    End With 
    Set rs = Server.CreateObject("ADODB.Recordset") 
    rs.Open cmdOB.Execute, , adOpenKeyset, adLockPessimistic 
    Set SecureOpenUpdateableRS = rs 
    Set rs = Nothing 
End Function 

當我打電話與功能:

 
Set rs = SecureOpenUpdateableRS("SELECT CustID, LastActive, LoggedIn, SessionID FROM tblLogins WHERE EMail = ? AND PWord = ?", strEMail, strPassword) 

我得到一個「500 - 內部服務器錯誤」,這可能是因爲我禁用服務器上的調試。
關於如何使原始功能更安全而不破壞它的任何想法?

回答

1

您必須創建參數並將它們追加到命令的參數集合中。只需將值分配給(同一個!)參數即可。谷歌的樣本;也許this VB! sample會讓你開始。

補充:

我能想到的兩種策略來獲得的參數類型:如果你通過了正確/最大限度指定參數值可以在地圖VarType(value)常數函數

  1. 到參數類型常量
  2. 如果您根據命令文本中的字段名執行SELECT,則可以將記錄集的字段.Type s映射到參數類型常量

對於所有可能的情況來說,這不是微不足道的。我會傳遞值和期望類型的函數對。

+0

感謝您的快速回復。有沒有什麼辦法可以使用參數化語句而不必確定輸入參數的類型? – Vinayak 2013-03-28 11:02:37

+0

像這個StackOverflow頁面上的代碼: http://stackoverflow.com/questions/11020846/classic-asp-protection-against-sql-injection – Vinayak 2013-03-28 11:03:57

相關問題