好吧,我不同意 Dynamic Linq 中不可能进行注入。
中描述了什么answer https://stackoverflow.com/a/8740904/244353 by Ɖiamond ǤeezeƦ https://stackoverflow.com/users/909882/%C6%89iamond-%C7%A4eeze%C6%A6是正确的,但适用于在给定语言(C# 或 VB.Net)中构建的标准 Linq,或者通过调用扩展方法(例如.Where
与 lambda 函数。
那么,确实,不可能注入任何东西,因为 .NET Linq to Sql 转换器当然是编写得很好的。
因此,“SQL注入”是不可能的,这是事实。
然而,Dynamic Linq 可能发生“Linq 注入”攻击。在OP引用的linq安全性解释中,指出:
LINQ to Entities 查询不是通过使用字符串操作或串联来组成的,并且它们不易受到传统 SQL 注入攻击。
基本上这是一个要点。如果查询是由字符串操作组成的,那么很容易受到注入攻击。而Dynamic Linq实际上是由字符串组成的,因此它很容易受到注入攻击。
显然,攻击者必须意识到您正在使用 DynamicLinq 并且只能攻击准备数据,因此会导致有效的恶意 Dynamic Linq 查询。
我想强调这个事实——决赛SQL被创作safely,但是否原创动态链接是安全的取决于你.
使动态 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。