使用动态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-sql
和linq-to-entities
(尽管上面引用了实体框架)。
答案 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注入攻击不应该是可能的。