【问题标题】:Injection Attacks against .NET DataView RowFilter针对 .NET DataView RowFilter 的注入攻击
【发布时间】:2010-11-18 23:28:00
【问题描述】:

所以我正在编写一个处理程序,它使用 DataView RowFilter 属性根据 AppRelativeCurrentExecutionFilePath 过滤缓存的 DataTable。对输入进行编码以防止注入攻击的最佳方法是什么?

以下内容是否足够?有没有更好/更优雅的方式?

dataView.RowFilter = String.Format("Name LIKE '{0}%'", EncodeString(query));

private string EncodeString(string s)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.Length; i++)
    {
        char c = s[i];
        if (c == '*' || c == '%' || c == '[' || c == ']')
            sb.Append("[").Append(c).Append("]");
        else if (c == '\'')
            sb.Append("''");
        else
            sb.Append(c);
    }

    return sb.ToString();
}

【问题讨论】:

  • 我不认为你可以在这里注入 sql...只会导致异常。但是,是的,这正是我所做的。
  • 如果您使用内存中的数据,为什么要使用DataTable 而不仅仅是任何集合?您可以使用 Where 过滤它,而不必担心注入。
  • @SergRogovtsev - 我在 09 年问过这个问题,所以它可能是一个 .NET 1.1 应用程序。企业升级缓慢。

标签: c# encoding sql-injection dataview rowfilter


【解决方案1】:

您不能在 RowFilter 中注入 sql。

编辑:正如所指出的,可以通过注入获取表中的所有行,可能类似于以下工作:

dataTable.AsEnumerable()
    .Where(r => r.Field<string>("StringColumn").Contains(userInput))
    .ToList().ForEach(r => Console.WriteLine(r.Field<string>("StringColumn")));

【讨论】:

  • RowFilter 是一个与 SQL Where 子句非常相似的字符串,如果您从用户输入构建过滤器字符串,则可以通过注入来利用它。在我的示例中,我正在根据 URL(例如 site/handler/stringUsedInFilter)过滤 DataTable,并且过滤器是 LIKE 比较,因此“handler/”之后的任何内容都需要进行清理,否则类似于“%25%25%25%25%” 25" 将绕过最小长度和空字符串检查以返回整个表格内容。 "'" 会导致过滤器无效并抛出异常。等等……
  • 是的,为了不返回您必须保护的完整表。是否有过返回整个表的情况,或者您可以防止这种情况?
  • @Yuriy :如果他们要过滤的输入真的是 %%%%% 怎么办?这对他们没有多大好处。如果输入是 O'Brien 怎么办?这将导致抛出 SyntaxErrorException。输入需要过滤。
  • 是时候创建一个继承自 DataView 的参数化控件了吗?
猜你喜欢
  • 2019-07-10
  • 2016-11-05
  • 2013-08-31
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
相关资源
最近更新 更多