如何在ADODB.RecordSet中使用ADODB.CommandObject?

如何在ADODB.RecordSet中使用ADODB.CommandObject?

问题描述:

我想通过参数化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 - 内部服务器错误”,这可能是因为我禁用服务器上的调试。
关于如何使原始功能更安全而不破坏它的任何想法?

您必须创建参数并将它们追加到命令的参数集合中。只需将值分配给(同一个!)参数即可。谷歌的样本;也许this VB! sample会让你开始。

补充:

我能想到的两种策略来获得的参数类型:如果你通过了正确/最大限度指定参数值可以在地图VarType(value)常数函数

  1. 到参数类型常量
  2. 如果您根据命令文本中的字段名执行SELECT,则可以将记录集的字段.Type s映射到参数类型常量

对于所有可能的情况来说,这不是微不足道的。我会传递值和期望类型的函数对。

+0

感谢您的快速回复。有没有什么办法可以使用参数化语句而不必确定输入参数的类型? – Vinayak 2013-03-28 11:02:37

+0

像这个*页面上的代码: http://*.com/questions/11020846/classic-asp-protection-against-sql-injection – Vinayak 2013-03-28 11:03:57