Dynamic Linq会导致sql注入吗?

时间:2018-01-05 06:37:24

标签: c# linq linq-to-sql code-injection

我们使用动态linq对IQueryable列表进行排序,代码如下:

foreach (string sortField in sort)
{
    if (sortField.StartsWith("0"))
    {
        sortFields.Add(string.Format("{0} ASC", sortField.TrimStart('0')));
    }
    else if (sortField.StartsWith("1"))
    {
        sortFields.Add(string.Format("{0} DESC", sortField.TrimStart('1')));
    }
    else
    {
        sortFields.Add(sortField);
    }
    return query.OrderBy(String.Join(",", sortFields));
}

sort值来自用户输入的问题是危险的吗?

我们正在使用HP强化来扫描代码,这个工具给我们SQL injection: Linq问题,我不知道原因......

1 个答案:

答案 0 :(得分:0)

如果您使用String.Format创建SQL表达式的一部分,那么您将用户代码注入SQL。

最终sortField将被放入SQL ORDER BY子句中:

SELECT ...
ORDER BY sortField1 ASC, sortField2 DESC, ...

想象一下,用户为第一个排序字段输入1Name; DROP ALL TABLES --之类的东西。

现在你有了

SELECT ...
ORDER BY Name ASC; DROP ALL TABLES --, sortField2 DESC

如果您的查询将处理多个语句,那可能会非常糟糕。