我正在构建一个IQueryable
,我正在应用相关过滤器,我在这里遇到了这行代码。
items = items.OrderBy(string.Format("{0} {1}", sortBy, sortDirection));
此代码段易受SQL注入攻击吗?或者在幕后参数化这些(字符串)参数?我假设所有Linq查询都为我进行了转义和参数化,但是我能够像这样直接传入一个字符串这一事实让我失望。
答案 0 :(得分:17)
出于以下原因,您必须避免从可能不受信任的呼叫者处理的方法中返回IQueryable<T>
类型:
公开IQueryable<T>
类型的查询的使用者可以调用
暴露安全数据或增加大小的结果的方法
结果集。 例如,考虑以下方法签名:
public IQueryable<Customer> GetCustomer(int customerId)
此查询的使用者可以在返回的.Include("Orders")
上调用IQueryable<Customer>
以检索查询不打算公开的数据。通过将方法的返回类型更改为IEnumerable<T>
并调用实现结果的方法(例如.ToList()
),可以避免这种情况。
IQueryable<T>
查询
迭代,一个公开IQueryable<T>
的查询的使用者
type可以捕获抛出的异常。 Exceptions
可以包含
不适合消费者的信息。
如何防止SQL注入攻击?
可以在实体SQL中执行SQL注入攻击,方法是将malicious input
提供给query predicate
和parameter names
中使用的值。
避免 注入SQL的风险
您永远不应将用户输入与实体SQL命令文本
组合在一起
实体SQL在任何接受文字的地方查询accept parameters
。 您应该使用参数化查询而不是将文字 从外部代理直接注入查询。您还应该考虑 使用查询构建器方法 来安全地构建实体SQL。
虽然在LINQ to Entities中可以进行查询组合,但它是通过对象模型API执行的。与实体SQL查询不同,LINQ to Entities查询不是使用字符串操作或连接组成的,而 它们不受传统SQL注入攻击的影响。