2011-05-11 122 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