Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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
SQL注入保护使用MVC-存储过程包括动态SQL_Sql_Asp.net Mvc_Entity Framework_Security_Entity Framework 5 - Fatal编程技术网

SQL注入保护使用MVC-存储过程包括动态SQL

SQL注入保护使用MVC-存储过程包括动态SQL,sql,asp.net-mvc,entity-framework,security,entity-framework-5,Sql,Asp.net Mvc,Entity Framework,Security,Entity Framework 5,我的一个客户端使用动态SQL作为存储过程的一部分。他们不想改变这一点。我正在建立一个MVC网站,它应该使用这种高风险的存储过程。因此,在实体框架中使用参数并不能解决问题 当我使用旧的、好的SQL助手时,我检查了ExecuteQuery函数中的所有参数,并试图找到有风险的关键字。但是现在,当我使用本机.NET Entity Framework 5时,我没有共享函数,我可以在那里检查它 对每个特定字段使用验证器对我来说都不好。是否有一个选项可以为执行SP的实体框架部分生成过度添加函数,或者如何解决该

我的一个客户端使用动态SQL作为存储过程的一部分。他们不想改变这一点。我正在建立一个MVC网站,它应该使用这种高风险的存储过程。因此,在实体框架中使用参数并不能解决问题

当我使用旧的、好的SQL助手时,我检查了ExecuteQuery函数中的所有参数,并试图找到有风险的关键字。但是现在,当我使用本机.NET Entity Framework 5时,我没有共享函数,我可以在那里检查它


对每个特定字段使用验证器对我来说都不好。是否有一个选项可以为执行SP的实体框架部分生成过度添加函数,或者如何解决该问题的任何其他想法?

您没有说存储过程中的动态SQL是否使用参数。假设不是,最好的解决方案是在查询执行时为单引号编码字符串

e、 g.创建一个方法
stringencodesqlstring(strings){返回s.replace(“'”,“'”);}

然后调用这个方法

cmd.CommandText = "SP_FOO";
cmd.CommandType = CommandType.StoredProcedure;
EntityParameter param = new EntityParameter();
param.Value = EncodeSqlString(myString);
param.ParameterName = "MyParam";
cmd.Parameters.Add(param);
这是最安全的方法,因为您只对传递给存储过程的字符串值进行编码,不在其他地方和引号编码不合适的上下文中使用这些值,并且可以降低截断的风险(只要SPs中没有发生截断)。这也只有在SP只使用这些值来构造SQL查询时才能正常工作——如果他们对这些值做了其他事情,那么这可能不是正确的方法

仅将字符串值传递到此方法。对于其他不带引号的类型,在将它们传递到参数中之前,应确保它们是正确的类型。e、 g.对于
int

  string number = Request.QueryString["Number"];
    if (int.TryParse(number, out myInt))
    {
      cmd.CommandText = "SP_BAR";
      cmd.CommandType = CommandType.StoredProcedure;
      EntityParameter param = new EntityParameter();
      param.Value = myInt;
      param.ParameterName = "MyParam";
      cmd.Parameters.Add(param);
    }
    else
    {
      // handle appropriately but do not use value
    }

您不会说存储过程中的动态SQL是否使用参数。假设不是,最好的解决方案是在查询执行时为单引号编码字符串

e、 g.创建一个方法
stringencodesqlstring(strings){返回s.replace(“'”,“'”);}

然后调用这个方法

cmd.CommandText = "SP_FOO";
cmd.CommandType = CommandType.StoredProcedure;
EntityParameter param = new EntityParameter();
param.Value = EncodeSqlString(myString);
param.ParameterName = "MyParam";
cmd.Parameters.Add(param);
这是最安全的方法,因为您只对传递给存储过程的字符串值进行编码,不在其他地方和引号编码不合适的上下文中使用这些值,并且可以降低截断的风险(只要SPs中没有发生截断)。这也只有在SP只使用这些值来构造SQL查询时才能正常工作——如果他们对这些值做了其他事情,那么这可能不是正确的方法

仅将字符串值传递到此方法。对于其他不带引号的类型,在将它们传递到参数中之前,应确保它们是正确的类型。e、 g.对于
int

  string number = Request.QueryString["Number"];
    if (int.TryParse(number, out myInt))
    {
      cmd.CommandText = "SP_BAR";
      cmd.CommandType = CommandType.StoredProcedure;
      EntityParameter param = new EntityParameter();
      param.Value = myInt;
      param.ParameterName = "MyParam";
      cmd.Parameters.Add(param);
    }
    else
    {
      // handle appropriately but do not use value
    }

我不知道EF5的情况,但总的来说没有快速解决方法。扫描列入黑名单的关键词几乎完全是浪费时间,要么你会屏蔽人们可能使用的完全合法的词(例如
),要么你会错过各种各样的攻击。可能两者都有。检查存储过程代码,看看您得到了什么类型的注入。如果它只是注入到字符串文本中,那么禁止在所有形式的输入中使用撇号将是您的第一步。如果他们正在为整数注入无引号的变量,请确保所有此类字段都是整数。如果它们是列名,请将输入锁定为已知的正确值。这是一种蹩脚的、不可扩展的、脆弱的开发方式,但如果你真的无法更改现有的坏代码,那你就只能这么做了-(您可以做的另一件事是将动态代码的所有输入中的撇号转义为replace([参数],“,”,“”),然后,如果发生sql注入攻击,则会转义单引号,并将整个值作为字符串处理并持久化,而不执行其意图。我通常会避免对输入进行转义。即使在需要esca的上下文的不同上下文中使用输入时,也会忽略从中得到的损坏ping,它不一定是无懈可击的。例如,如果字符串被替换、切片或(通常是隐式的)在
'
->
'
转义后被截断可能会丢弃其中一个撇号,从而打开同一查询中另一个字段进行注入的可能性。您能否用一个示例更新您的问题,说明动态SQL查询是如何在SP中构造的?我不知道EF5,但通常没有quick fix.扫描列入黑名单的关键词几乎完全是浪费时间,或者你会屏蔽人们可能使用的完全合法的词(例如
),否则您将错过各种各样的攻击。可能两者都有。检查存储过程代码,看看您得到了什么类型的注入。如果它只是注入到字符串文本中,那么禁止在所有形式的输入中使用撇号将是您的第一步。如果他们为整数注入不带引号的变量,请确保所有这些字段都是正确的ally是整数。如果它们是列名,则将输入锁定为已知的良好值。这是一种蹩脚、不可扩展、脆弱的开发方式,但如果您真的无法更改现有的损坏代码,那么您所能做的就只有这些了。:-(您可以做的另一件事是将所有输入中的撇号转换为replace([参数],“,”,“”),然后,如果发生sql注入攻击,则会转义单引号,并将整个值作为字符串处理并持久化,而不执行其意图。我通常会避免对输入进行转义。即使在需要esca的上下文的不同上下文中使用输入时,也会忽略从中得到的损坏ping,它不一定是无懈可击的。例如,如果字符串在
'
->
''之后被替换、切片或(通常是隐式地)截断