我使用动态 linq 核心库将过滤器作为字符串获取。这里我向 apiye 发送一个字符串表达式。我正在使用 apide 动态 linq 核心库将字符串表达式解析为表达式。为了安全起见,我应该采取什么途径?作为示例,我在下面创建了一个名为 ValidatePredicate 的方法。你对此有什么建议吗?
private bool ValidatePredicate(string predicate)
{
// allowed entity property name
var allowedFields = new[] { nameof(OrganisationItem.ItemType), nameof(OrganisationItem.OrganisationItemName), nameof(OrganisationItem.isActive) };
// Allowed operators
var allowedOperators = new[] { "==", "&&", "||", ".Contains" };
// Check for each allowed property field name and operator
foreach (var field in allowedFields)
{
if (predicate.Contains(field))
{
continue;
}
return false; // Return false if a disallowed property is found
}
foreach (var op in allowedOperators)
{
if (predicate.Contains(op))
{
continue;
}
return false; // Return false if a disallowed operator is found
}
// ';' lack of character
if (predicate.Contains(";"))
{
return false;
}
return true;
}
这仍然允许在服务器上执行相当多的任意 SQL(例如信息泄露,即如果您对客户恶意软件预定义了过滤器,那么用户就可以执行
where customerId = ... or 1 = 1
)。如果您想要受控的动态过滤并防止注入 - 创建相应的 DSL(例如类似于规范模式的东西),解析它并使用查询参数化重新构建它,因此像 field1 = 1 or field2 = 'foo'
这样的东西将被解析为 3 个操作(1 or
和 2 个比较)并转换为 field1 = @param1 or field2 = @param2
并将值 1
和 'foo'
添加为参数。
另请参阅: