我需要构建与WHERE子句一起使用的搜索条件。然后将此搜索条件传递给另一个应用程序,以作为SQL查询的一部分执行。因为搜索条件可能非常复杂(包括子查询),我不相信接收应用程序可以智能地解析它们以防止SQL注入攻击。
最佳做法规定应使用参数化查询。当您使用命令对象自己执行查询时,这很好。在我的情况下,我希望获得具有参数合并到其中的查询字符串,并解析我感兴趣的搜索子句的位置。有没有办法做到这一点?
我使用MS SQL Server,目前只需用调用者收到的字符串中的两个单引号替换所有单引号。有没有更好的方法来实现某种程度的SQL注入攻击保护?
答案 0 :(得分:2)
答案 1 :(得分:1)
来自OWASP的一些guidelines
答案 2 :(得分:1)
我认为你很好:根据SQL Server Books Online,一个单独的单引号似乎是退出引用的字符串的唯一方法单引号。因此,用'
替换''
就足以避免通过string
变量注入SQL。
如果正确(区域设置不变)转换为字符串,我无法想到通过其他非字符串本机C#数据类型注入SQL的方法。
尽管如此,参数化查询是“推荐”的解决方案。目前,您的应用程序似乎是这样组织的:
是否可以选择像这样重写你的应用程序?
我处于类似情况并通过创建SubSQL
类来解决它,该类基本上包含带有CommandText的参数化字符串和带参数的哈希表。然后,您可以将其用作mySubSQL.CommandText += ...
,mySubSQL.Parameters("@myfield") = myValue
和mySubSQL.MergeInto(myCommand)
(实施应该是明显且直接的)。