我目前正在用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