实体框架+ sql注入

本文关键字:注入 sql 框架 实体 | 更新日期: 2023-09-27 18:05:51

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

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

这个片段容易受到SQL注入吗?或者这些(字符串)参数是在后台参数化的?我假设所有的Linq查询都为我进行了转义和参数化,但是我能够像这样直接传递字符串的事实使我感到困惑。

实体框架+ sql注入

第一点:

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

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

    public IQueryable<Customer> GetCustomer(int customerId)

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

  • 因为IQueryable<T>查询在结果是一个公开IQueryable<T>的查询的消费者类型可以捕获抛出的异常。Exceptions可以包含

第二点:

如何防止SQL注入攻击

  • 实体SQL注入攻击:

SQL注入攻击可以在实体SQL中通过向query predicateparameter names中使用的值提供malicious input来执行。

避免 SQL注入的风险

永远不要将用户输入与实体SQL命令文本结合使用

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

  • LINQ to Entities injection attack:

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

参考: 安全注意事项(实体框架)