【问题标题】:ADO Command.Execute With Array of Parameters & SQL InjectionADO Command.Execute 带参数数组和 SQL 注入
【发布时间】: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


【解决方案1】:

在我看来:是的。

我写了一个简单的例子,然后用 Visual Studio 调试它。调用后

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

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

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

【讨论】:

  • 谢谢。当您说您使用 VS 进行调试时,那是在调试经典的 ASP 脚本吗?如果是这样,你是怎么做到的?我有 VS 2010 在工作,无法创建经典的 ASP 项目,当我将脚本拖到 IDE 中时,没有选项可以在本地运行或调试它。如果我可以在本地运行它,那将改变我现在使用它的方式。现在,我使用增强的文本编辑器在服务器上工作。谢谢!
  • @Dave 是的,我在 IIS 中的机器上本地运行它。我在我的 asp 脚本中使用“stop”关键字来设置断点。不过有一些先决条件。您必须在您的 iis 等中为 asp 启用服务器端调试。
猜你喜欢
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多