LINQ-To-SQL如何防止SQL注入?

时间:2011-05-11 20:02:19

标签: c# sql-server linq linq-to-sql sql-injection

我目前正在使用C#和LINQ-TO-SQL进行项目。这个项目将安全性作为高优先级,所以显然我想防止SQL注入。我搜索了这个问题,但它并没有发现任何有用的东西。 微软自己的常见问题解答告诉我,注入没有问题,因为LINQ处理参数的方式,但是看到LINQ在调试器中生成的代码,并且已经阅读了一些关于LINQ-To-SQL如何构建到SQL的内容我不确定这是如何适用的。

有没有人有任何关于此事的文献/联系?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

Linq to SQL自动使用SQLParameters。用户输入转换为参数值,而不是简单的串联字符串(这是允许SQL注入的内容)。这发生在服务器端,IIRC,所以你可能只是看到客户端代码。如果您想要更多背景和信息,可以阅读the information here

答案 2 :(得分:1)

它使用参数化查询。 {{3P>