使用Entity Framework是否可以使用IQueryable SQL注入证明?

dax*_*axu 7 linq entity-framework sql-injection iqueryable

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

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

var myquery = mytesttable.AsQueryable();
var qText = "name="+ "\""+DynamicSearchCondition+ "\"";
myquery = myquery.Where(qText);
Run Code Online (Sandbox Code Playgroud)

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

最初我认为这不是sql注入证明,但我尝试了一些例子,并且无法打破这一个.这是否意味着它是免费的sql注入(我认为现在是)?

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

Oce*_*t20 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注入)。

Microsoft 对于 LINQ to Entities 和 SQL 注入是这样说的:

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

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

这意味着您的 DynamicLinq 构建的 IQueryable(如果使用 LINQ to Entities 作为提供程序)仍应参数化输入。如果您的问题确实是“LINQ to Entities 注入是否有效?”,那么我能给出的最佳答案是“可能。他们已尽一切合理努力来防止这种情况发生。”。