C# 为SQL WHERE子句生成安全搜索条件
我需要构建搜索条件以与WHERE子句一起使用。然后将此搜索条件传递给另一个应用程序,作为SQL查询的一部分执行。因为搜索条件可能非常复杂(包括子查询),我不相信接收应用程序能够智能地解析它们以防止SQL注入攻击 最佳实践表明应使用参数化查询。当您自己使用命令对象执行查询时,这一点很好。在我的例子中,我希望获得包含合并参数的查询字符串,并解析出我感兴趣的where搜索子句。有办法做到这一点吗C# 为SQL WHERE子句生成安全搜索条件,c#,.net,sql,sql-server,sql-injection,C#,.net,Sql,Sql Server,Sql Injection,我需要构建搜索条件以与WHERE子句一起使用。然后将此搜索条件传递给另一个应用程序,作为SQL查询的一部分执行。因为搜索条件可能非常复杂(包括子查询),我不相信接收应用程序能够智能地解析它们以防止SQL注入攻击 最佳实践表明应使用参数化查询。当您自己使用命令对象执行查询时,这一点很好。在我的例子中,我希望获得包含合并参数的查询字符串,并解析出我感兴趣的where搜索子句。有办法做到这一点吗 我使用MS SQL Server,目前只需将所有单引号替换为从调用方收到的字符串中的两个单引号。有没有更好
我使用MS SQL Server,目前只需将所有单引号替换为从调用方收到的字符串中的两个单引号。有没有更好的方法来实现某种程度的SQL注入攻击防护 看看这两个链接 及
看看这两个链接 及 一些来自OWASP一些来自OWASP我认为您很好:根据,单引号似乎是退出以单引号开始的带引号字符串的唯一方法。因此,用
'
替换'
应该足以避免通过字符串
变量注入SQL
如果其他非字符串本机C#数据类型正确地(区域设置不变)转换为字符串,我想不出任何方法来通过它们注入SQL
然而,参数化查询是“推荐”的解决方案。目前,您的应用程序似乎是这样组织的:
SubSQL
类解决了这个问题,这个类基本上包含一个带有CommandText的参数化字符串和一个带有参数的哈希表。然后,您可以将其用作mySubSQL.CommandText+=…
,mySubSQL.Parameters(“@myfield”)=myValue
和mySubSQL.MergeInto(myCommand)
(实现应该是显而易见的和直接的),单引号似乎是退出以单引号开头的带引号字符串的唯一方法。因此,用'
替换'
应该足以避免通过字符串
变量注入SQL
如果其他非字符串本机C#数据类型正确地(区域设置不变)转换为字符串,我想不出任何方法来通过它们注入SQL
然而,参数化查询是“推荐”的解决方案。目前,您的应用程序似乎是这样组织的:
我遇到了类似的情况,通过创建一个
SubSQL
类解决了这个问题,这个类基本上包含一个带有CommandText的参数化字符串和一个带有参数的哈希表。然后可以将其用作mySubSQL.CommandText+=…
,mySubSQL.Parameters(“@myfield”)=myValue
和mySubSQL.MergeInto(myCommand)
(实现应该是显而易见的和直接的)。如果您得到的字符串已经将参数合并到其中,您怎么能“将所有单引号替换为两个单引号"? 这不会破坏像WHERE name='KOTMATPOCKUH'
这样的东西吗?@Heinzi我要建立WHERE,所以我得到了搜索值KOTMATPOCKUH。但是,它也可能包含恶意代码。使用参数本来是很理想的,但看起来我无法让.NET帮我完成工作并返回查询。@KOTMATPOCKUH:谢谢,我现在明白了。net将无法返回“合并”字符串,因为参数化查询是在SQL Server端解析的(即,net发送字符串加上单独数据字段中的参数)。如果您获取的字符串已合并参数,您如何“用两个单引号替换所有单引号”?这不会破坏像WHERE name='KOTMATPOCKUH'
这样的东西吗?@Heinzi我要建立WHERE,所以我得到了搜索值KOTMATPOCKUH。但是,它也可能包含恶意代码。使用参数本来是很理想的,但看起来我无法让.NET帮我完成工作并返回查询。@KOTMATPOCKUH:谢谢,我现在明白了。net将无法返回“合并”字符串,因为参数化查询是在SQL Server端解析的(即,net发送字符串加上单独数据字段中的参数)。信息性读取,但不幸的是,为我指明了从用户输入中替换/剥离非法字符的方向,因为参数化在我的情况下是不可能的。如果我误解了,我很抱歉,但我认为这是你的意图?我正在寻找一种比“替换引号”更好的保护方法