快速提问...我必须使用相当多的旧代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的调用错误并从内存中写入,已更正。
答案 0 :(得分:2)
从我的视线:是的。
我写了一个快速示例,然后使用Visual Studio进行调试。致电后
Command.Execute , Array(1, "BBB")
ADODB.Command的Parameters对象已正确填充Array中的给定值。正确设置参数的数据类型和长度。
因此,在我看来,这种方法与方法#1一样安全(使用手动创建的Parameters对象)。