使用Entity Framework的IQueryable是否具有防止SQL注入的功能?

7
我知道如果我使用linq to sql,所有内容都将被参数化,并且能够防止SQL注入。但是IQueryable又如何呢?
例如,我可以将一些实体强制转换为IQueryable:
var myquery = mytesttable.AsQueryable();
var qText = "name="+ "\""+DynamicSearchCondition+ "\"";
myquery = myquery.Where(qText);

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

最初我认为这不是防止SQL注入的,但我尝试了一些例子,就是无法破解这个。

那是否意味着它现在是SQL注入安全的(我认为是)?

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


我认为查看此博客 http://blogs.msdn.com/b/publicsector/archive/2008/08/21/preventing-sql-injection-with-the-entity-framework-and-data-services.aspx 不安全。 - johnny 5
正确的链接是:http://blogs.msdn.com/b/publicsector/archive/2008/08/21/preventing-sql-injection-with-the-entity-framework-and-data-services.aspx - Rob Sedgwick
它可能会逃避'. 你看到它是否进行了更改以防止感染攻击了吗?显然,参数化查询是最佳实践。 - paparazzo
1
@daxu,如果您正在使用DynamicLinq,则可能会帮助您阅读此文章 - Grundy
2
可能是 Is Injection Possible through Dynamic LINQ? 的重复问题。 - Robert McKee
显示剩余3条评论
2个回答

2

毫无疑问,它容易受到注入攻击的威胁。

针对您的具体案例:

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

使用这个方法会失败:

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

从技术上讲,可以说这不是 SQL 注入,而是 DynamicLinq 谓词注入攻击,但“外观和感觉”相同,并具有类似的问题。由于 DynamicLinq 的语法本质上是 SQL(或自己的 SQL 版本),因此您也可以认为它仍然是一种 SQL 注入,只是被转换为表达式树,然后再次转换为 SQL。 - Robert McKee
无论哪种情况,它都容易受到更一般的注入攻击,无论你如何看待它。 - Robert McKee
这些是类似的问题,绝对应该考虑到,但问题是关于SQL注入,涉及查询参数化。 - Ocelot20
@Ocelot20 这仍然是SQL注入。请给出这个注入没有达到的SQL注入定义。是否在(最终)查询中插入了不需要/计划之外的SQL语句?是的。它确实防止了常见的DROP TABLE类型注入攻击,但存在其他安全问题,可能会导致类似的问题。例如,如果用于登录的DynamicSql,你可以创建一个用户名,允许任何人以管理员身份登录。 - Robert McKee
@Ocelot20,你可能会无意中允许访问你不应该访问的记录,或者更新/删除你不应该访问的记录(将所有人的密码更改为“blah”,包括管理员,或授予自己管理员权限)。假设其他限制都在同一个Where子句中。 - Robert McKee

0

不,IQueryable 本身并不具有防注入功能,因为它只是用于构建查询 Expression 的接口。它没有定义如何将该 Expression 转换为要执行的内容(例如 SQL)。执行这个操作的是查询 Provider(有许多种,例如 Linq to Objects、Linq to Entities、Linq to Excel)。

话虽如此,你的示例似乎使用了 DynamicLinq(基于 .Where(string) 扩展使用),应该像常规 Linq to Entities IQueryable 一样具有类似的参数化保护。DynamicLinq 不会引入任何额外的 SQL 注入问题,因为它只是在 IQueryable 上工作的实用程序。它所做的一切都只是被翻译成一个表达式树,该表达式树再次依赖于 Provider 来实际转换为 SQL。这并不意味着 DynamicLinq 语法本身不会受到自身注入潜力的影响(请参见此处获取一些示例,但这些示例不是 SQL 注入)。

微软对 LINQ to Entities 和 SQL 注入有以下说明:

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

虽然在LINQ to Entities中可以进行查询组合,但是它是通过对象模型API执行的。与Entity SQL查询不同,LINQ to Entities查询不是通过字符串操作或连接来组合的,也不容易受到传统的SQL注入攻击。

这意味着,如果使用LINQ to Entities作为提供程序,您的DynamicLinq构建的IQueryable仍应该对输入参数进行参数化处理。如果您的问题真的是“LINQ to Entities是否具有防注入功能?”,那么我能给出的最好答案是“可能。他们已经尽一切合理努力来防止它。”。


DynamicLinq 确实 会引入额外的 SQL 注入问题,因为它是通过使用字符串操作和/或串联来组合的,所以容易受到传统的 SQL 注入攻击。 - Robert McKee
不,它并没有,我甚至包括了SQL注入和DynamicLinq注入之间的区别示例。你能否给我一个例子来支持你的说法? - Ocelot20
请参见我上面的答案,或者查看我指示的重复答案。 - Robert McKee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接