Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为SQL WHERE子句生成安全搜索条件_C#_.net_Sql_Sql Server_Sql Injection - Fatal编程技术网

C# 为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,目前只需将所有单引号替换为从调用方收到的字符串中的两个单引号。有没有更好

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

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


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

看看这两个链接


看看这两个链接

一些来自OWASP一些来自OWASP我认为您很好:根据,单引号似乎是退出以单引号开始的带引号字符串的唯一方法。因此,用
'
替换
'
应该足以避免通过
字符串
变量注入SQL

如果其他非字符串本机C#数据类型正确地(区域设置不变)转换为字符串,我想不出任何方法来通过它们注入SQL

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

  • 第A部分基于用户输入创建WHERE语句
  • 包含此WHERE语句的字符串被传递到B部分
  • 第B部分添加SELECT等并将其发送到SQL Server
  • 这样重写应用程序是一种选择吗

  • 第A部分创建一个参数化WHERE语句以及一组基于用户输入的参数
  • 一个包含WHERE语句的字符串加上一个包含参数的哈希表(或类似的东西)被传递到B部分
  • 第B部分创建一个命令,添加SELECT等,添加参数并将其发送到SQL Server
  • 我遇到了类似的情况,通过创建一个
    SubSQL
    类解决了这个问题,这个类基本上包含一个带有CommandText的参数化字符串和一个带有参数的哈希表。然后,您可以将其用作
    mySubSQL.CommandText+=…
    mySubSQL.Parameters(“@myfield”)=myValue
    mySubSQL.MergeInto(myCommand)
    (实现应该是显而易见的和直接的),单引号似乎是退出以单引号开头的带引号字符串的唯一方法。因此,用
    '
    替换
    '
    应该足以避免通过
    字符串
    变量注入SQL

    如果其他非字符串本机C#数据类型正确地(区域设置不变)转换为字符串,我想不出任何方法来通过它们注入SQL

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

  • 第A部分基于用户输入创建WHERE语句
  • 包含此WHERE语句的字符串被传递到B部分
  • 第B部分添加SELECT等并将其发送到SQL Server
  • 这样重写应用程序是一种选择吗

  • 第A部分创建一个参数化WHERE语句以及一组基于用户输入的参数
  • 一个包含WHERE语句的字符串加上一个包含参数的哈希表(或类似的东西)被传递到B部分
  • 第B部分创建一个命令,添加SELECT等,添加参数并将其发送到SQL Server

  • 我遇到了类似的情况,通过创建一个
    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发送字符串加上单独数据字段中的参数)。信息性读取,但不幸的是,为我指明了从用户输入中替换/剥离非法字符的方向,因为参数化在我的情况下是不可能的。如果我误解了,我很抱歉,但我认为这是你的意图?我正在寻找一种比“替换引号”更好的保护方法