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-sql和linq-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.
| 归档时间: |
|
| 查看次数: |
13468 次 |
| 最近记录: |