实体框架+ sql注入

ale*_*ang 7 c# sql entity-framework sql-injection

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

items = items.OrderBy(string.Format("{0} {1}", sortBy, sortDirection));
Run Code Online (Sandbox Code Playgroud)

这段代码容易受到SQL注入吗?或者在幕后参数化这些(字符串)参数?我假设所有的Linq查询都为我进行了转义和参数化,但是我能够像这样直接传入一个字符串的事实让我失望了.

Sam*_*ath 19

第一点:

您必须避免IQueryable<T>从暴露给可能不受信任的调用方的方法返回类型,原因如下:

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

    public IQueryable<Customer> GetCustomer(int customerId)

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

  • 因为IQueryable<T>在迭代结果时执行查询,所以公开IQueryable<T> 类型的查询的使用者可以捕获抛出的异常.Exceptions可能包含不适合消费者的信息.

第二点:

如何防止SQL注入攻击?

  • 实体SQL注入攻击:

SQL注入攻击可以通过提供malicious input在a query predicate和in 中使用的值在Entity SQL中执行parameter names.

避免 SQL注入的风险

您永远不应将用户输入与Entity SQL命令文本相结合

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

  • LINQ to Entities注入攻击:

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

参考: 安全考虑因素(实体框架)