【发布时间】:2013-08-22 03:57:43
【问题描述】:
快速提问...我必须使用我正在清理的大量遗留 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来电。
使用我的包装 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 注入攻击?
谢谢。
编辑对 Execute 的调用是错误的,并且是从内存中写入的,它已被更正。
【问题讨论】:
-
取自这里 (msdn.microsoft.com/en-us/library/ms808187.aspx) 似乎参数数组被打包到命令的参数对象中。但是好像不能把 SQL 语句作为 Execute 的第一个参数?或者这行得通吗?
-
不,你说的完全正确,当我从记忆中写出来的时候我已经累了。我的包装器这样做,即 DB.Query("select ...", Array(1, "BBB")) 并将其正确地转换为 Command.Execute 调用。我将更新问题以反映正确的语法。感谢您指出这一点。
标签: security asp-classic vbscript sql-injection ado