简单的问题...我必须使用大量正在清理的遗留 ASP 代码,并且它们都使用容易受到 SQL 注入(inject)攻击的查询。我有一个库,我将它们放在一起用参数化查询替换它们,我想知道以下方法从安全角度来看是否存在差异。
方法 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")
是的,忽略执行的第一个参数。
第一种方法指定了每个参数的类型、大小等,并且需要与数据库匹配。但如果一切都不是“刚刚”完美的话,我总是会遇到这种方法的麻烦,奇怪的错误等等。所以我更喜欢后者,事实上它更适合我的编码风格,因为我可以将数据库逻辑封装到一个类中并根据需要传递数组,而不必在代码中添加大量数据库来电。
使用我的包装器 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)
(传递关键字empty表示未使用该参数)
鉴于此,我想知道:方法 #2 仍然可以免受 SQL 注入(inject)攻击吗?
谢谢。
编辑对 Execute 的调用是错误的,是根据内存编写的,已更正。
最佳答案
从我的角度来看:是的。
我编写了一个快速示例,然后使用 Visual Studio 对其进行了调试。调用后
Command.Execute , Array(1, "BBB")
ADODB.Command 的参数对象已正确填充数组中的给定值。参数的数据类型和长度设置正确。
因此,在我看来,这种方法与方法#1(使用手动创建的参数对象)一样安全。
关于security - 使用参数数组和 SQL 注入(inject)执行 ADO Command.Execute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18371437/