【问题标题】:Is IQueryable SQL injection proof using Entity Framework?IQueryable SQL 注入证明是否使用实体框架?
【发布时间】:2015-10-01 11:43:08
【问题描述】:

我知道如果我使用 linq to sql,一切都会被参数化并且 sql 注入是安全的。 但是 IQueryable 怎么样?

例如,我可以将某些实体强制转换为 Iqueryable:

var myquery = mytesttable.AsQueryable();
var qText = "name="+ "\""+DynamicSearchCondition+ "\"";
myquery = myquery.Where(qText);

然后在运行查询时,从跟踪中我可以看到传入的 DynamicSearchCondition 没有参数化。

最初我认为这不是 sql 注入证明,但后来我尝试了一些示例,但就是无法破解这个。 这是否意味着它是没有sql注入的(我认为是现在)?

如果是这样,是否意味着所有 IQueryable 都是 sql 注入安全的?

【问题讨论】:

标签: entity-framework linq sql-injection iqueryable


【解决方案1】:

绝对容易受到注入攻击。

对于您的特定示例:

var myquery = mytesttable.AsQueryable();
var qText = "name="+ "\""+DynamicSearchCondition+ "\"";
myquery = myquery.Where(qText);

会失败:

var DynamicSearchCondition= "\" or \"\"=\"";

【讨论】:

  • 从技术上讲,我想可以说这不是 SQL 注入,而是 DynamicLinq 谓词注入攻击,但“外观和感觉”是相同的,有类似的问题。由于 DynamicLinq 的语法本质上是 SQL(或者它自己的 SQL 风格),因此您也可以争辩说它仍然是 SQL 注入,只是被转换成表达式树,然后再次返回 SQL。
  • 在任何一种情况下,无论您如何看待它,它都容易受到更一般的注入攻击。
  • 它们是类似的问题,绝对应该考虑,但问题是关于 SQL 注入,指的是查询的参数化。
  • @Ocelot20 还是SQL注入。请给出这个不符合的SQL注入的定义。是否将不需要的/计划外的 SQL 插入到(最终)查询中?是的。它确实阻止了常见的DROP TABLE 类型注入,但还有其他安全问题会导致类似问题。例如,如果 DynamicSql 用于登录,您可以制作一个允许任何人以管理员身份登录的用户名。
  • @Ocelot20 您可能无意中允许访问查看您不应该被允许访问的记录,或者更新/删除您不应该被允许访问的记录(将每个人的密码更改为“等等”,包括管理员,或授予自己管理员权限)。假设其他限制都在同一个Where 子句中。
【解决方案2】:

不,IQueryable 本身不是注入证明,因为它只是构建查询Expression 的接口。它没有定义如何获取 Expression 并将其转换为要执行的东西,例如 SQL。 执行此操作的是查询 Provider(很多都存在。Linq to Objects、Linq to Entities、Linq to Excel 等等)。

也就是说,您的示例似乎使用 DynamicLinq(基于 .Where(string) 扩展使用)应该具有与常规 Linq 到实体 IQueryable 类似的参数化保护。 DynamicLinq 没有引入任何额外的SQL 注入问题,因为它只是一个在IQueryable 之上工作的实用程序。它所做的一切都只是转换为一个表达式树,该树再次依赖于Provider 来实际转换为 SQL。这并不意味着 DynamicLinq 语法本身可以避免其自身的注入潜力(请参阅here 了解一些示例,但这些不是 SQL 注入)。

微软对 LINQ to Entities 和 SQL 注入有这样的说法:

Security Considerations (Entity Framework)

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

这意味着您的 DynamicLinq 构建的 IQueryable(如果使用 LINQ to Entities 作为提供程序)仍应参数化输入。如果您的问题真的是“LINQ to Entities 注入证明吗?”,那么我能给出的最佳答案是“可能。他们已尽一切合理努力来防范它。”。

【讨论】:

  • DynamicLinq DOES 引入了额外的 SQL 注入问题,因为它是通过使用字符串操作和/或连接组成的,因此它IS容易受到传统 SQL 的影响注入攻击。
  • 不,它没有,我什至包括了 SQL 注入和 DynamicLinq 注入之间区别的示例。你能给我一个例子来支持你的主张吗?
  • 查看上面的答案,或查看我指出的重复答案。
猜你喜欢
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
相关资源
最近更新 更多