0

我试图通过使 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)

我收到“500 - 内部服务器错误”,这可能是因为我禁用了服务器上的调试。
关于如何在不破坏原始功能的情况下使原始功能更安全的任何想法?

4

1 回答 1

1

您必须创建参数并将它们附加到命令的参数集合中。仅将值分配给(相同!)参数是不可能的。谷歌样本;也许这个VB!示例将帮助您入门。

添加:

我可以想到两种策略来派生参数类型:

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

对于所有可能的情况,要做到这一点并非易事。我会将成对的值和所需的类型传递给函数。

于 2013-03-28T09:53:01.697 回答