此LINQ语句易受SQL注入的攻击吗?
var result = from b in context.tests
where b.id == inputTextBox.Text
select b;其中context是一个实体,test是一个表。我正在尝试学习LINQ,我认为它的好处是它不容易受到sql注入的攻击,但我看到的一些东西却有不同的说法。我需要参数化这个LINQ语句以使它更安全吗?如果是这样的话,是怎么做的?
这也会被认为是linq to sql或linq to entities吗?
发布于 2010-09-30 04:57:32
简要回答: LINQ不易受到注入的攻击。
长篇答案:
LINQ与SQL不同。在后台有一个完整的库,它从编译器从您的代码生成的表达式树构建SQL,将结果映射到对象-当然,它还负责确保过程中的安全。
如何保护LINQ to
免受SQL注入攻击?
对于通过连接用户输入形成的传统SQL查询来说,SQL注入一直是一个重大风险。通过在查询中使用SqlParameter,LINQ to SQL避免了这种注入。将用户输入转换为参数值。这种方法可以防止恶意命令从客户输入中被使用。
在内部,这意味着当LINQ to SQL查询数据库时,不使用普通值,而是将它们作为SQL参数传递,这意味着数据库永远不能将它们视为可执行代码。对于大多数(如果不是所有的) ORM映射器也是如此。
比较这两种方法(完全是伪代码):
string name = "' ; DROP DATABASE master --"
run ("SELECT * FROM Authors WHERE Name = '" + name + "'") // oops!
// now we'd better use parameters
SqlParameter name = new SqlParameter ("@name", "' ; DROP DATABASE master --")
run ("SELECT * FROM Authors WHERE Name = @name", name) // this is pretty safe我建议您深入研究LINQ语句的实际含义,以及何时和如何将它们转换为真正的SQL。你可能想学习LINQ standard query operator translation,deferred execution,different LINQ providers等。就LINQ而言,就像任何抽象技术一样,了解幕后发生的事情既令人着迷,又令人难以置信地有用。
附注:每次我看到关于SQL注入的问题,我都会忍不住想起这篇网络漫画。

发布于 2010-09-30 04:55:29
不是的。LINQ to Entities和LINQ to SQL处理SQL查询的生成,以避免SQL注入。如果您想知道在使用各种输入运行此查询时会生成什么SQL语句,则可以使用LINQPad。
它是LINQ to SQL还是LINQ to Entities取决于您的context对象是什么,并且不能从这个代码片段中确定。
只有在使用ExecuteQuery方法运行自定义SQL查询(see here)时,才需要担心LINQ中的SQL注入。但是在这一点上,您已经离开了语言集成查询,回到了生成您自己的字符串的世界。
发布于 2010-09-30 04:55:47
LINQ使用参数化查询,因此通常不会受到SQL注入的影响。例如,您的示例不容易受到攻击。
https://stackoverflow.com/questions/3825760
复制相似问题