通过动态LINQ可以注入吗?

Sep*_*eph 41 c# linq linq-to-entities dynamic-linq linq-to-sql

使用Dynamic LINQ库(链接),是否容易受到注入?和(如果是的话)如何防止这种情况?

安全注意事项(实体框架)的一些背景知识:

LINQ to Entities注入攻击:

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

由于动态SQL是使用字符串组成的,这意味着它可能容易受到注入向量的影响吗?或者LINQ to SQL会根据Dynamic LINQ库中的基础数据类型自动处理参数化值吗?

或者它是完全安全的,因为动态查询将在内存中执行而不是在SQL上执行(从而否定SQL索引的任何好处)?

我一直在努力理解DynamicLibrary.cs代码,但我确信我可以很容易地忽略一些东西.

由于这个问题是关于动态LINQ库本身,这个问题可以被认为适用于两者linq-to-sqllinq-to-entities(尽管上面引用了实体框架).

Kri*_*izz 31

好吧,我不同意在Dynamic Linq中注射是不可能的.

什么在描述答案通过ƉiamondǤeezeƦ是正确的,但为给定的语言内构建appies标准的LINQ - C#或VB.Net或通过调用扩展方法就像.Where用lambda函数.

那么,是的,不可能注入任何东西,因为.NET Linq到Sql翻译器当然是正确编写的.因此,"SQL注入"是不可能的,这是真的.

然而,Dynamic Linq的可能性是"Linq注射"攻击.在OP引用的linq的安全性解释中,陈述:

LINQ to Entities查询不是使用字符串操作或连接组成的,并且它们不易受传统SQL注入攻击的影响.

基本上这是一个要点.如果查询是由字符串操作组成的,那么它很容易受到注入攻击.而Dynamic Linq实际上是由字符串组成的,因此它很容易受到注入攻击.

显然,攻击者必须意识到您正在使用DynamicLinq并且只能攻击准备数据,因此会导致有效的恶意Dynamic Linq查询.

我想强调一下这个事实 - 最终的SQL安全的,但是原始的动态Linq是否安全取决于你.

使动态linq查询安全的必要条件是对所有用户输入使用占位符.永远不要连接你的字符串!

想象一下以下查询:

dataset.Where("allowed == 1 and code == \"" + user_entered_data + "\"");
Run Code Online (Sandbox Code Playgroud)

如果输入未被清理且未被转义,则攻击者可能会输入:

200" or allowed == 0 and code == "200
Run Code Online (Sandbox Code Playgroud)

这将导致:

allowed == 1 and code == "200" or allowed == 0 and code == "200"
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,您应该使用占位符:

dataset.Where("allowed == 1 and code == @0", user_entered_data);
Run Code Online (Sandbox Code Playgroud)

DynamicLinq将使占位符(在本例中为:用户输入的数据)成为lambda参数(而不是将其连接到查询中)并依赖于Linq-To-Entities(或任何后端)来安全地转换为SQL.

  • @Seph - 不,由于linq查询永远不会转换为更新,插入或删除SQL,因此无法更改记录.唯一可能的攻击可能是通过修改"where"过滤器来获取对未授权数据的访问. (3认同)