SQL-类似过滤器中的注入

SQL-like injection in filters

我正在构建允许构建 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-注入式 漏洞。如果我打电话给

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

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

我的问题:

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

很好,如果您从 external/untrusted 来源获取字符串,使用这些来源构建查询字符串绝非安全。

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

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

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