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 搜索的替代方法是小心地转义启用注入的特殊字符。一个简单的起点是:
- 对于字符串字段,转义单引号(重复引号)。
- 对于数字、布尔值和日期,完全解析文字(例如使用 int.parse、float.parse、bool.parse 等)并在添加之前将其重新转换为字符串它到过滤器。这不仅有助于注入,还允许您采用 OData 假定的区域设置和格式以外的输入(例如,“,”与“.”作为小数点分隔符、日期格式等)。
我正在构建允许构建 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 搜索的替代方法是小心地转义启用注入的特殊字符。一个简单的起点是:
- 对于字符串字段,转义单引号(重复引号)。
- 对于数字、布尔值和日期,完全解析文字(例如使用 int.parse、float.parse、bool.parse 等)并在添加之前将其重新转换为字符串它到过滤器。这不仅有助于注入,还允许您采用 OData 假定的区域设置和格式以外的输入(例如,“,”与“.”作为小数点分隔符、日期格式等)。