为SQL WHERE子句构建安全的搜索条件

时间:2009-12-06 15:18:27

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

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

最佳做法规定应使用参数化查询。当您使用命令对象自己执行查询时,这很好。在我的情况下,我希望获得具有参数合并到其中的查询字符串,并解析我感兴趣的搜索子句的位置。有没有办法做到这一点?

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

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

来自OWASP的一些guidelines

答案 2 :(得分:1)

认为你很好:根据SQL Server Books Online,一个单独的单引号似乎是退出引用的字符串的唯一方法单引号。因此,用'替换''就足以避免通过string变量注入SQL。

如果正确(区域设置不变)转换为字符串,我无法想到通过其他非字符串本机C#数据类型注入SQL的方法。

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

  1. A部分根据用户输入创建WHERE语句。
  2. 包含此WHERE语句的字符串将传递给B部分。
  3. B部分添加SELECT等并将其发送到SQL Server。
  4. 是否可以选择像这样重写你的应用程序?

    1. A部分根据用户输入创建参数化WHERE语句和一组参数。
    2. 包含WHERE语句以及包含参数的Hashtable(或类似内容)的字符串将传递给B部分。
    3. B部分创建命令,添加SELECT等,添加参数并将其发送到SQL Server。
    4. 我处于类似情况并通过创建SubSQL类来解决它,该类基本上包含带有CommandText的参数化字符串和带参数的哈希表。然后,您可以将其用作mySubSQL.CommandText += ...mySubSQL.Parameters("@myfield") = myValuemySubSQL.MergeInto(myCommand)(实施应该是明显且直接的)。