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 predicate
和 parameter 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 注入攻击。
我正在构建一个 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 predicate
和 parameter 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 注入攻击。