ASP经典 - Recordset对象与Command对象

问题描述:

我使用ASP经典和SQL Server 2000来创建动态网站。ASP经典 - Recordset对象与Command对象

我对何时使用记录集对象以及何时在查询数据库时使用命令对象有点困惑。

我被告知如果存储过程将从SELCT语句返回记录,那么我应该使用记录集,但是如果我正在更新或插入,那么我应该使用命令对象并将所有数据作为参数传递给存储过程。

当使用记录我经常传递任何所需的数据,像这样:

rs.Source = "spTest " & id 

我送花儿给人验证我传递,以确保它是什么,我期待和它转换为它的正确类型的数据。

我已经被告知但是上面的方法让我的代码对SQL注入攻击开放,并且我应该总是使用一个命令对象。

这是正确的吗?

谢谢

是的,没错。

想象有人传递字符串:0;从用户删除*;'然后

您查询的是:

spTest 0; delete * from users; 

如果幸运的话,你不会有一个用户表。就我个人而言,我会一直使用命令对象来保持一致性。你可以从它得到你需要的一切。

下面是如何可以用该命令的对象做一个简单的例子:

Dim oStoredProc : Set oStoredProc = Server.CreateObject("ADODB.Command") 

    With oStoredProc 
     .ActiveConnection = oDBConnection 
     .CommandType = adCmdStoredProc 
     .CommandText = "up_procname" 
     .Parameters.Append(.CreateParameter("@Param1", ADODB.adInteger, ADODB.adParamInput, 22, 11)) 
     .Parameters.Append(.CreateParameter("@Param2", ADODB.adInteger, ADODB.adParamOutput, 22, 12) 

     Call .Execute() 

     myVal = .Parameters("@Param2") 
    End With 

    Set oStoredProc = Nothing 
+0

谢谢。 这样说,就像我给出的例子一样,我知道参数将是数字,并且我已验证输入以确保它是。按照我所描述的方式使用记录集对象会好吗,还是应该使用命令对象?我只问很多时间,只有数值是我经历的,如果我不必经历和改变它们,它会为我节省很多时间。 谢谢 – chester600 2010-08-06 14:56:25

你被告知什么是确实是正确的:你应该总是使用COMMANDE对象,以防止SQL注入。使用参数化查询,您将所有的安全和参数的ADO层(虽然你还是应该做自己适当的验证)验证,你甚至可能会得到一些性能改进(这些参数化查询由SQL Server缓存)

当你执行一个命令,你有两个选择:要么你的SQL执行返回行(SELECT语句,或者一些存储过程),那么你必须使用记录来存储这些行,要么不不(更新,删除,其他程序),那么你有理由执行命令,不用担心记录集。

编辑:只是为了确保一切都清楚了你,我用詹姆斯·怀斯曼的代码上面,它适用于你的例子:

Dim oStoredProc : Set oStoredProc = Server.CreateObject("ADODB.Command") 

With oStoredProc 
    .ActiveConnection = oDBConnection 
    .CommandType = adCmdStoredProc 
    .CommandText = "spTest ?" 
    .Parameters.Append(.CreateParameter("id", ADODB.adInteger, ADODB.adParamInput, id, 11)) 
    Dim rs : Set rs = .Execute() 
End With 

Set oStoredProc = Nothing 

没有测试,但是应该是确定:-)

最后但并非最不重要的:即使你现在保护得很好,不要忘记,如果你在你的存储过程中使用动态SQL,你可能仍然有一个SQL注入安全漏洞(只要你连接字符串来创建SQL你可能会容易我会说)!

+0

谢谢。那么我是否应该只将记录集对象与命令obbject结合使用? 我还假设在运行一个不需要传递参数的存储过程时使用记录集对象是可以的? 谢谢 – chester600 2010-08-06 14:59:43

+0

为了使事情更简单,我鼓励你总是使用相同的方法:只要总是使用Recordsets与Command对象,不要再考虑它了。 有时您可能需要更多一些类型的键入,但可以使用一些可以编写的帮助程序函数轻松避免此问题(您将很快会看到哪些代码总是重复) – 2010-08-06 15:09:39