Asp classic 如何将ADODB.CommandObject与ADODB.RecordSet一起使用?

Asp classic 如何将ADODB.CommandObject与ADODB.RecordSet一起使用?,asp-classic,vbscript,adodb,parameterized,Asp Classic,Vbscript,Adodb,Parameterized,我试图通过使SQL语句参数化,使经典的ASP/VBScript网站更加安全。 我有以下功能: Function OpenUpdateableRS(strSQL) Dim rs Set rs = Server.CreateObject("ADODB.Recordset") rs.Open strSQL, cnDZ, adOpenKeyset, adLockPessimistic, adCmdText Set OpenUpdateableRS = rs S

我试图通过使SQL语句参数化,使经典的ASP/VBScript网站更加安全。

我有以下功能:

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) 设置rs=SecureOpenUpdateables(“从tblLogins中选择CustID、LastActive、LoggedIn、SessionID,其中EMail=?和PWord=?”、strEMail、strPassword) 我得到一个“500-内部服务器错误”,这可能是因为我禁用了服务器上的调试。

关于如何在不破坏原始函数的情况下使其更安全,您有什么想法吗?

您必须创建参数并将其附加到命令的参数集合中。仅仅将值分配给(同一!)参数是不可能的。谷歌的一个样本;也许会让你开始

添加:

我可以想出两种策略来推导参数类型:

  • 如果将正确/最大指定的参数值传递给函数,则可以将
    VarType(value)
    常量映射到参数类型常量
  • 如果根据命令文本中的字段名进行选择,则可以将记录集的字段
    .Type
    s映射到参数类型常量

  • 在所有可能的情况下都能做到这一点并非小事。我会将成对的值和所需的类型传递给函数。

    感谢您的快速响应。是否有任何方法可以在不确定输入参数类型的情况下使用参数化语句?如StackOverflow页面上的代码: