2011-05-11 231 views
5

我目前正在用C#和LINQ-TO-SQL做一個項目。這個項目的安全性非常重要,所以顯然我想阻止SQL注入。我在這件事上搜索了一下,但沒有發現任何有用的東西。 微軟自己的FAQ告訴我,注入是沒有問題的,因爲LINQ處理參數的方式,然而看到LINQ在調試器中產生的代碼,並閱讀了一些關於LINQ-to-SQL如何構建到SQL的問題,我不是肯定這是如何適用的。LINQ-To-SQL如何防止SQL注入?

有沒有人有處理這件事的任何文學/聯繫?

回答

6

的LINQ to SQL自動使用SQLParameters。用戶輸入變成了參數值,而不是簡單的連接字符串(這是允許SQL注入的)。這發生在serverside,IIRC,所以你可能只是看到客戶端代碼。如果你想要更多的背景和信息,你可以閱讀the information here

+0

好的,文章的第2頁清除了我的問題。謝謝您的回答! – fk2 2011-05-11 20:14:59

6

這很簡單,真的 - 翻譯從不注入變量而不參數化它們;所以:

var orders = from ord in ctx.Orders 
      where ord.CustomerName = name 
      select ord; 

將變爲:

SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @p0 

其中p0是與你的捕捉name

不多也少取值的參數。但是這可以避免注入攻擊。相反,一個不正確意外:

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = '" + name + "'"; 

它引入了巨大的風險。當然你也可以正確地進行參數化上面,太:

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @name"; 

(與價值從name添加參數@name

+0

怎麼樣?假設我有一個包含String的輸入字段。有人輸入「Drop Database」或類似的東西。這將評估爲'SELECT * FROM [Orders] WHERE [CustomerId] =; Drop Database'。那我有沒有問題? – fk2 2011-05-11 20:07:58

+0

@ fk2,我不認爲你瞭解參數化的sql ... – canon 2011-05-11 20:09:03

+1

@ fk2'@ p0' ***是一個參數***;它永遠不會被評估爲TSQL;它可以是任何字符串內容,沒有任何風險 – 2011-05-11 20:15:39