簡短的回答: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