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