如何在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)
常数函数
- 到参数类型常量
- 如果您根据命令文本中的字段名执行SELECT,则可以将记录集的字段
.Type
s映射到参数类型常量
对于所有可能的情况来说,这不是微不足道的。我会传递值和期望类型的函数对。
感谢您的快速回复。有没有什么办法可以使用参数化语句而不必确定输入参数的类型? – Vinayak 2013-03-28 11:02:37
像这个*页面上的代码: http://*.com/questions/11020846/classic-asp-protection-against-sql-injection – Vinayak 2013-03-28 11:03:57