ADO Command.Execute With Array of Parameters& SQL注入

时间:2013-08-22 03:57:43

标签: security asp-classic vbscript sql-injection ado

快速提问...我必须使用相当多的旧代ASP代码来清理它,并且它都使用易受SQL注入攻击的查询。我有一个库,我把它们放在一起用参数化查询替换它们,我想知道在以下方法之间是否存在安全角度的差异。

方法1:这是大多数示例中显示的方法,其中参数对象单独构建并添加到Command对象。 Here's an example from another question

方法2:将Command.Execute方法与参数值数组一起使用。例如:

Command.CommandText = "select foo, bar from baz where a = ? and b = ?"
Command.Execute , Array(1, "BBB")

是的,将忽略Execute的第一个参数。

第一种方法是使用所有指定的类型,大小等构建每个参数,并且它需要匹配数据库。但是,如果一切都不“完美”,我总是遇到这种方法,奇怪的错误等问题。所以我更喜欢后者,它实际上更适合我的编码风格很多因为我可以将DB逻辑封装到一个类中并根据需要传递数组,而不必使用大量数据库丢弃我的代码调用

使用我的包装器DB.Query方法的方法#2的示例:

set rs = DB.Query("select foo, bar from baz where a = ? and b = ?", Array(1, "BBB")

或者:

set rs = DB.Query("select foo, bar from baz", empty)

(传递关键字以表示不使用该参数)

考虑到这一点,我想知道:方法#2对SQL注入攻击仍然安全吗?

感谢。

编辑对Execute的调用错误并从内存中写入,已更正。

1 个答案:

答案 0 :(得分:2)

从我的视线:是的。

我写了一个快速示例,然后使用Visual Studio进行调试。致电后

Command.Execute , Array(1, "BBB")

ADODB.Command的Parameters对象已正确填充Array中的给定值。正确设置参数的数据类型和长度。

因此,在我看来,这种方法与方法#1一样安全(使用手动创建的Parameters对象)。