首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >此LINQ语句易受SQL注入的攻击吗?

问此LINQ语句易受SQL注入的攻击吗?
EN

Stack Overflow用户
提问于 2010-09-30 04:52:54
回答 6查看 9K关注 0票数 9

此LINQ语句易受SQL注入的攻击吗?

代码语言:javascript
复制
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吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-30 04:57:32

简要回答: LINQ不易受到注入的攻击。

长篇答案:

LINQ与SQL不同。在后台有一个完整的库,它从编译器从您的代码生成的表达式树构建SQL,将结果映射到对象-当然,它还负责确保过程中的安全。

请参阅LINQ to SQL FAQ

如何保护LINQ to

免受SQL注入攻击?

对于通过连接用户输入形成的传统SQL查询来说,SQL注入一直是一个重大风险。通过在查询中使用SqlParameter,LINQ to SQL避免了这种注入。将用户输入转换为参数值。这种方法可以防止恶意命令从客户输入中被使用。

在内部,这意味着当LINQ to SQL查询数据库时,不使用普通值,而是将它们作为SQL参数传递,这意味着数据库永远不能将它们视为可执行代码。对于大多数(如果不是所有的) ORM映射器也是如此。

比较这两种方法(完全是伪代码):

代码语言:javascript
复制
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注入的问题,我都会忍不住想起这篇网络漫画。

​

​

票数 33
EN

Stack Overflow用户

发布于 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注入。但是在这一点上,您已经离开了语言集成查询,回到了生成您自己的字符串的世界。

票数 2
EN

Stack Overflow用户

发布于 2010-09-30 04:55:47

LINQ使用参数化查询,因此通常不会受到SQL注入的影响。例如,您的示例不容易受到攻击。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3825760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档