【问题标题】:SQL Injection protect using MVC - The Stored Procedures included Dynamic SQL使用 MVC 的 SQL 注入保护 - 存储过程包括动态 SQL
【发布时间】:2013-09-17 18:07:45
【问题描述】:

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

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

对每个特定字段都使用验证器对我不利。是否有一个选项可以为执行 SP 的实体框架部分制作过度添加功能或任何其他想法如何解决该问题?

【问题讨论】:

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

标签: sql asp.net-mvc entity-framework security entity-framework-5


【解决方案1】:

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

例如创建方法string EncodeSqlString(string s) { return 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);

这将是最安全的方式,因为您只对传递给存储过程的字符串值进行编码,您不会在其他地方和引号编码不合适的上下文中使用这些值,并且您将降低风险截断(只要在 SP 内没有发生截断)。这也只有在 SP 只使用这些值来构建 SQL 查询时才能正常工作 - 如果他们对它们做任何其他事情,那么这可能不是要走的路。

仅将字符串值传递给此方法。对于其他未加引号的类型,您应该在将它们传递给参数之前确保它们是正确的类型。例如对于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
    }

【讨论】:

    猜你喜欢
    • 2017-08-24
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2023-04-03
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多