我目前正在用C#和LINQ-TO-SQL做一個項目。這個項目的安全性非常重要,所以顯然我想阻止SQL注入。我在這件事上搜索了一下,但沒有發現任何有用的東西。 微軟自己的FAQ告訴我,注入是沒有問題的,因爲LINQ處理參數的方式,然而看到LINQ在調試器中產生的代碼,並閱讀了一些關於LINQ-to-SQL如何構建到SQL的問題,我不是肯定這是如何適用的。LINQ-To-SQL如何防止SQL注入?
有沒有人有處理這件事的任何文學/聯繫?
我目前正在用C#和LINQ-TO-SQL做一個項目。這個項目的安全性非常重要,所以顯然我想阻止SQL注入。我在這件事上搜索了一下,但沒有發現任何有用的東西。 微軟自己的FAQ告訴我,注入是沒有問題的,因爲LINQ處理參數的方式,然而看到LINQ在調試器中產生的代碼,並閱讀了一些關於LINQ-to-SQL如何構建到SQL的問題,我不是肯定這是如何適用的。LINQ-To-SQL如何防止SQL注入?
有沒有人有處理這件事的任何文學/聯繫?
的LINQ to SQL自動使用SQLParameters。用戶輸入變成了參數值,而不是簡單的連接字符串(這是允許SQL注入的)。這發生在serverside,IIRC,所以你可能只是看到客戶端代碼。如果你想要更多的背景和信息,你可以閱讀the information here。
這很簡單,真的 - 翻譯從不注入變量而不參數化它們;所以:
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
)
好的,文章的第2頁清除了我的問題。謝謝您的回答! – fk2 2011-05-11 20:14:59