对于字符串谓词我应该采取什么样的安全措施?

问题描述 投票:0回答:1

我使用动态 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;
}
c# .net string security sql-injection
1个回答
0
投票

这仍然允许在服务器上执行相当多的任意 SQL(例如信息泄露,即如果您对客户恶意软件预定义了过滤器,那么用户就可以执行

where customerId = ... or 1 = 1
)。如果您想要受控的动态过滤并防止注入 - 创建相应的 DSL(例如类似于规范模式的东西),解析它并使用查询参数化重新构建它,因此像
field1 = 1 or field2 = 'foo'
这样的东西将被解析为 3 个操作(1
 or
和 2 个比较)并转换为
field1 = @param1 or field2 = @param2
并将值
1
'foo'
添加为参数。

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.