实体框架+ sql注入

时间:2016-09-07 00:01:57

标签: c# sql entity-framework sql-injection

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

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

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

1 个答案:

答案 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中执行SQL注入攻击,方法是将malicious input提供给query predicateparameter names中使用的值。

避免 注入SQL的风险

  

您永远不应将用户输入与实体SQL命令文本

组合在一起

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

  • LINQ to Entities注入攻击:

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

参考: Security Considerations (Entity Framework)