【问题标题】:How does LINQ-To-SQL prevent SQL-Injections?LINQ-To-SQL 如何防止 SQL 注入?
【发布时间】:2011-05-12 04:07:25
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 好的,文章的第 2 页解决了我的问题。谢谢你的回答!
    【解决方案2】:

    这很简单,真的——翻译永远不会在没有参数化的情况下注入变量;所以:

    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

    【讨论】:

    • 怎么样?假设我有一个包含字符串的输入字段。有人输入“;Drop Database”或类似的东西。这评估为SELECT * FROM [Orders] WHERE [CustomerId] = ;Drop Database。那我就没有问题了吗?
    • @fk2 @p0 是一个参数;它永远不会被评估为 TSQL;可以是任意字符串内容,没有任何风险
    • @fk2 不,它不会评估为,sql 参数不会替换它们的值来构建要执行的 sql 字符串。参数包含数据,不作为sql执行。
    • @fk2 ,有点像过去的爆炸,但你所说的将被评估为 SELECT * FROM [Orders] WHERE [CustomerId] = ";Drop Database" 。如果不是 CUstomerId 和 id ;Drop Database ,它将返回一个空选择..
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 2011-06-21
      • 2011-10-02
      • 2011-06-12
      相关资源
      最近更新 更多