2010-09-29 136 views
9

这是LINQ统计容易受SQL注入?此LINQ语句是否容易受到SQL注入的影响?

var result = from b in context.tests 
    where b.id == inputTextBox.Text 
    select b; 

其中上下文是一个实体和测试是一个表。 我试图学习LINQ,我认为它的好处是它不容易被sql注入,但是我看到的一些东西有不同的说法。我需要参数化这个LINQ语句以使它更安全吗?如果是这样,怎么样?

也将这被认为是LINQ到SQL或LINQ实体?

回答

31

简短的回答:LINQ是不容易受到SQL注入。

龙答:

LINQ是不是像SQL。在后台有一个完整的库,它可以从代码中编译器生成的表达式树构建SQL,将结果映射到对象 - 当然,这样做会使得事情变得安全。

LINQ to SQL FAQ

问:如何是LINQ to SQL的保护 SQL注入攻击?

答:SQL注入对于通过连接用户 输入形成的传统SQL 存在重大风险。 LINQ to SQL通过在 查询中使用SqlParameter避免了这样的 注入。用户输入变为 参数值。这种方法 可防止从客户输入中使用恶意命令 。

在内部,它意味着当LINQ到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 translationdeferred executiondifferent LINQ providers等等。在LINQ的情况下,就像任何抽象技术一样,这对于了解幕后发生的事情来说既迷人又非常有用。

P.S.每当我看到一个关于SQL注入的问题时,我都忍不住想起这个webcomic。

sql injection

+0

把它放在报价块而不是代码块 – msarchet 2010-09-29 20:59:12

+0

是的,错过了按钮。感谢您指出。 – 2010-09-29 20:59:44

+1

但是,如果您使用Linq来连接字符串和输入,您可能仍然存在漏洞。 – Oded 2010-09-29 21:02:09

2

编号LINQ to Entities和LINQ to SQL处理生成SQL查询以避免SQL注入。如果您想要查看使用各种输入运行此查询时生成的SQL语句,则可以使用LINQPad。

无论是LINQ to SQL还是LINQ to Entities,取决于您的context对象是什么,并且无法从此代码段中确定。

如果您使用ExecuteQuery方法来运行自定义SQL查询(see here),唯一需要担心LINQ中的SQL注入的时间。但是在那个时候,你已经离开了语言一体化查询,并回到了生成你自己的字符串的世界。

2

LINQ使用参数化查询,所以它通常不会受到SQL注入的影响。举个例子,你的例子不是脆弱的。

2

LINQ to Entities提供程序使用参数化查询并对SQL注入完全安全。

1

的LINQ to SQL生成参数化查询,以便它可以防止SQL注入攻击

0

的Linq paramaterizes所有查询,因此不容易受到SQL注入攻击。但是,您仍然应该验证所有的用户输入,否则您将面临跨站脚本攻击。

+0

尽管我同意用户输入应该被验证,但是我没有看到什么跨站点脚本攻击与它有关。 – StriplingWarrior 2010-09-29 21:05:17

+0

那么这取决于实际上对数据做了什么,如果直接从数据库中显示数据,任何自定义脚本都将/可能被执行。 – Padwah 2010-09-29 21:12:48

+0

哦,所以你说的是,如果你在浏览器中显示用户输入的文本时不逃避HTML,对吧?这不是我认为验证用户输入的分类,但我明白你的意思。 – StriplingWarrior 2010-09-29 21:22:53

相关问题