Entity Framework + sql 注入

Entity Framework + sql injection

我正在构建一个 IQueryable 应用相关过滤器的地方,我在这里遇到了这行代码。

items = items.OrderBy(string.Format("{0} {1}", sortBy, sortDirection));

此代码段是否易受 SQL 注入攻击?或者这些(字符串)参数是否在幕后参数化?我假设所有 Linq 查询都为我转义和参数化,但我能够像这样直接传入字符串这一事实让我失望。

第一点:

由于以下原因,您必须避免returning IQueryable<T> 来自可能不受信任的调用者的方法类型:

  • 公开 IQueryable<T> 类型的查询的消费者可以调用 暴露安全数据或增加大小的结果的方法 结果集。 例如,考虑以下方法签名:

    public IQueryable<Customer> GetCustomer(int customerId)

此查询的使用者可以在 returned IQueryable<Customer> 上调用 .Include("Orders") 来检索查询不打算公开的数据。这可以通过将方法的 return 类型更改为 IEnumerable<T> 并调用实现结果的方法(例如 .ToList())来避免。

  • 因为 IQueryable<T> 查询是在结果为 迭代,一个公开 IQueryable<T> 的查询的消费者 type 可以捕获抛出的异常。 Exceptions 可能包含 信息不适合消费者。

第二点:

如何防止SQL注入攻击?

  • 实体SQL注入攻击:

SQL 注入攻击可以在实体 SQL 中执行,方法是向 query predicateparameter names 中使用的值提供 malicious input

避免注射的风险SQL

you should never combine user input with Entity SQL command text

实体SQL 查询accept parameters 任何接受文字的地方。 您应该使用参数化查询,而不是将来自外部代理的文字 直接注入到查询中。您还应该考虑 使用查询构建器方法 来安全地构建实体 SQL.

  • LINQ to Entities 注入攻击:

尽管在 LINQ to Entities 中可以进行查询组合,但它是通过对象模型执行的 API。与实体 SQL 查询不同,LINQ to Entities 查询不是使用字符串操作或连接组成的,并且 它们不易受到传统 SQL 注入攻击。

参考: Security Considerations (Entity Framework)