通过动态LINQ可以注入吗?

时间:2012-01-05 07:20:56

标签: c# linq linq-to-sql linq-to-entities dynamic-linq

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

Security Considerations (Entity Framework)的一些背景信息:

  

LINQ to Entities注入攻击:

     

虽然在LINQ to Entities中可以进行查询组合,但确实如此   通过对象模型API执行。与Entity SQL查询不同,   LINQ to Entities查询不是使用字符串操作组成的   或者连接,它们不受传统SQL的影响   注射攻击。

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

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

我一直在努力理解DynamicLibrary.cs代码,但我确信我可以轻易忽略某些内容。

由于这个问题与动态LINQ库本身有关,因此可以认为此问题适用于linq-to-sqllinq-to-entities(尽管上面引用了实体框架)。

2 个答案:

答案 0 :(得分:31)

嗯,我不同意在Dynamic Linq中无法进行注射。

answer Ɖiamond ǤeezeƦ中描述的内容是正确的,但是在给定语言(C#或VB.Net)内构建标准Linq或通过使用lambda调用.Where等扩展方法功能。

然后,是的,不可能注入任何东西,因为.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 + "\"");

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

200" or allowed == 0 and code == "200

将导致:

allowed == 1 and code == "200" or allowed == 0 and code == "200"

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

dataset.Where("allowed == 1 and code == @0", user_entered_data);

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

答案 1 :(得分:3)

据我所知,在检查System.Data.Linq命名空间时,SQL对象树是从LINQ查询构建的,作为此过程的一部分,调用SqlParameterizer类以使用参数替换所有内联值。然后将值分配给参数。所以SQL注入攻击不应该是可能的。