【问题标题】:Build safe search conditions for SQL WHERE clause为 SQL WHERE 子句构建安全搜索条件
【发布时间】:2009-12-06 15:18:26
【问题描述】:

我需要建立与 WHERE 子句一起使用的搜索条件。然后将此搜索条件传递给不同的应用程序,以作为 SQL 查询的一部分执行。因为那里的搜索条件可能相当复杂(包括子查询),我不相信接收应用程序可以智能地解析它们以防止 SQL 注入攻击。

最佳实践表明应使用参数化查询。当您使用命令对象自己执行查询时,效果很好。在我的情况下,我希望获得带有合并参数的查询字符串,并解析出我感兴趣的搜索子句。有没有办法做到这一点?

我使用 MS SQL Server,目前只需将所有单引号替换为我从调用方收到的字符串中的两个单引号。有没有更好的方法来实现对 SQL 注入攻击的某种程度的保护?

【问题讨论】:

  • 如果你得到的字符串里已经有参数合并进去了,你怎么能“把所有的单引号都换成两个单引号”呢?这不会破坏像WHERE name = 'KOTMATPOCKUH' 这样的东西吗?
  • @Heinzi 我要构建 WHERE,因此我得到了搜索值 KOTMATPOCKUH。但是,它也可能包含恶意代码。使用参数本来是理想的,但看起来我无法让 .NET 为我完成工作并将查询返回给我。
  • @KOTMATPOCKUH:谢谢,我现在明白了。 .net 将无法返回“合并”字符串,因为参数化查询是在 SQL Server 端解析的(即 .net 在单独的数据字段中发送字符串和参数)。

标签: c# .net sql sql-server sql-injection


【解决方案1】:

【讨论】:

  • 信息性阅读,但不幸的是,我指出了从用户输入中替换/删除非法字符的方向,因为在我的情况下无法进行参数化。
  • 如果我误会了,我很抱歉,但我认为这是您的意图?
  • 我一直在寻找一种比“替换引号”更好的方法来防止注入攻击。或者证明替换引号就足够了。您回复中第二个线程的答案之一似乎表明处理报价应该足够好。但是,我将对输入字符串应用严格的规则,因为我会知道有效字符串可能包含的可能值。谢谢!
【解决方案2】:

来自 OWASP 的一些 guidelines

【讨论】:

    【解决方案3】:

    认为你很好:根据SQL Server Books Online,单独的单引号似乎是退出以a开头的带引号的字符串的唯一方法单引号。因此,将' 替换为'' 应该足以避免通过string 变量进行SQL 注入。

    我想不出任何方法可以通过其他非字符串本机C#数据类型注入SQL,如果它们正确(语言环境不变)转换为字符串。

    不过,参数化查询是“推荐”的解决方案。目前,您的应用程序似乎是这样组织的:

    1. A 部分根据用户输入创建 WHERE 语句。
    2. 包含此 WHERE 语句的字符串被传递到 B 部分。
    3. B 部分添加 SELECT 等并将其发送到 SQL Server。

    是否可以像这样重写您的应用程序?

    1. A 部分根据用户输入创建一个参数化的 WHERE 语句以及一组参数。
    2. 一个包含 WHERE 语句的字符串和一个包含参数的 Hashtable(或类似的东西)被传递到 B 部分。
    3. B 部分创建命令,添加 SELECT 等,添加参数并将其发送到 SQL Server。

    我遇到了类似的情况,并通过创建一个SubSQL 类来解决它,该类基本上包含一个带有 CommandText 的参数化字符串和一个带有参数的哈希表。然后,您可以将其用作 mySubSQL.CommandText += ...mySubSQL.Parameters("@myfield") = myValuemySubSQL.MergeInto(myCommand)(实现应该是显而易见且直接的)。

    【讨论】:

    • 不幸的是,重写应用程序以使用参数化查询不是一种选择。我的 .Net 应用程序必须将查询输入到 SugarCRM 的 SOAP API(用 PHP 编写)。到目前为止,我能做的最好的事情就是对可以传递到我的代码中的内容非常严格。例如,如果我正在使用 SOAP API 通过电子邮件地址查找用户,我必须确保调用者传递给我的字符串实际上是电子邮件地址,如果我正在寻找产品 SKU,请确保它是字母数字等。感谢您的帮助不过!
    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多