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

本文关键字:注入 SQL 何防止 LINQ-To-SQL | 更新日期: 2023-09-27 17:56:15

我目前正在做一个用C#和LINQ-TO-SQL的项目。这个项目将安全性作为重中之重,所以显然我想防止SQL注入。我用谷歌搜索了这件事,但它没有找到任何有用的东西。Microsoft自己的常见问题解答告诉我,由于 LINQ 处理参数的方式,注入不会有问题,但是看到 LINQ 在调试器中生成的代码并阅读了一些关于 LINQ-To-SQL 如何构建到 SQL 的信息,我不确定这如何应用。

有没有人有任何文献/联系来处理这个问题?

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

Linq to SQL 会自动使用 SQLParameter。用户输入被转换为参数值,而不仅仅是一个串联的字符串(这是允许SQL注入的原因)。这种情况发生在服务器端,IIRC,所以你可能只看到客户端代码。如果您想了解更多背景和信息,可以在此处阅读信息。

这很简单,真的 - 翻译从不注入变量而不参数化它们; 所以:

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

它使用参数化查询。 http://www.devx.com/dotnet/Article/34653/1954