【问题标题】:SQL-like injection in filters过滤器中的类 SQL 注入
【发布时间】:2020-04-27 06:33:13
【问题描述】:

我正在构建这个方法,它允许构建SearchParameters 对象。其中一种方法允许指定此对象的Filter 字段。长这样(简化版)

public SearchParameters CreateWithFilter(string fieldName, string operator, string value)
{
    var filterString = $"{fieldName} {operator} '{value}'";

    return new SearchParameters{ Filter = filterString };
}

所以我可以这样使用它

var searchParameters = this.CreateWithFilter("manufacturer", "eq", "volvo");

现在,问题是这段代码类似sql-injection易受攻击。如果我打电话给

var searchParameters = this.CreateWithFilter("manufacturer", "eq", "volvo' or someField eq 1 or manufacturer eq 'volvo");

我将成为一名出色的 Azure 搜索黑客 ;)

我的问题:

Azure 搜索中是否有任何特定技术类似于 SQL 世界中已知的技术,可以让我保护代码免受这些类型的注入?

【问题讨论】:

    标签: .net azure-cognitive-search azure-search-.net-sdk


    【解决方案1】:

    很好,如果您从外部/不受信任的来源获取字符串,那么使用这些来源构建查询字符串永远不会安全。

    在 SQL 中,推荐的方法是尽可能使用参数化查询(例如 SELECT * FROM Table WHERE field > @param)。不幸的是,Azure 搜索在这样的查询中没有参数。

    Azure 搜索的替代方法是小心转义启用注入的特殊字符。一个简单的起点是:

    1. 对于字符串字段,转义单引号(重复引号)。
    2. 对于数字、布尔值和日期,完全解析文字(例如,使用 int.parse、float.parse、bool.parse 等)并在将其添加到过滤器之前将其重新转换为字符串。这不仅有助于注入,还允许您以不同于 OData 假定的语言环境和格式进行输入(例如,“,”与“.”作为小数分隔符、日期格式等)。

    【讨论】:

      猜你喜欢
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2019-02-26
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多