简短的回答: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 translation,deferred execution,different LINQ providers等等。在LINQ的情况下,就像任何抽象技术一样,这对于了解幕后发生的事情来说既迷人又非常有用。
P.S.每当我看到一个关于SQL注入的问题时,我都忍不住想起这个webcomic。
把它放在报价块而不是代码块 – msarchet 2010-09-29 20:59:12
是的,错过了按钮。感谢您指出。 – 2010-09-29 20:59:44
但是,如果您使用Linq来连接字符串和输入,您可能仍然存在漏洞。 – Oded 2010-09-29 21:02:09