【问题标题】:LINQ & SQL Injection [duplicate]LINQ 和 SQL 注入 [重复]
【发布时间】:2012-07-17 07:54:48
【问题描述】:

可能重复:
Will using LINQ to SQL help prevent SQL injection

我正在使用 LINQ 访问 sql 数据库。下面的代码安全吗?

 var addRec = (from p in db.5544
                          where p.ID == newAddID
                          select p).Single();

            addRec.Address1 = comAddTxt1.Text;                                                                             //create address record
            addRec.Address2 = comAddTxt2.Text;
            addRec.Address3 = comAddTxt3.Text;
            addRec.Address4 = comAddTxt4.Text;
            addRec.PostCode = pstCdeTxt.Text;
            addRec.Town = twnTxt.Text;
            addRec.County = cntyTxt.Text;
            addRec.Country = cntComBox.SelectedItem.Text;

            db.SubmitChanges();

谢谢,

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    是的,它不会受到 SQL 注入攻击。

    不,它可能不安全,不会受到其他形式的攻击,即:跨站点脚本等,如果相关的话。

    【讨论】:

    • 如何防范这些其他形式的攻击?
    • 这取决于您的情况和您的应用程序,但总的来说,请清理并验证您的输入。
    【解决方案2】:

    我建议尝试调用存储过程并将值作为参数发送,以便它可以为您提供参数检查。例如,如果将 '@Address1' 声明为 varchar(200),则如果参数包含 sql 语句,则存储过程将不会执行。

    您还可以通过将字段与正则表达式进行比较来在时间之前检查字段,但这可能需要更多的努力,并且仍然不如使用存储过程那样安全。

    【讨论】:

    • LINQ 也完全可以防止注入;存储过程对 IMO 没有任何好处。
    • 除了数据库安全权限等
    【解决方案3】:

    为降低 XSS 攻击的风险,您应该在 Web 应用程序中从数据库中检索数据时对数据进行 HTMLEncode。

    【讨论】:

    • ...如果这是一个网络应用程序
    • ...如果这是一个 Web 应用程序 ;)
    • 我想说数据库应该包含实际的纯文本,而不是与特定输出格式相关的编码。如果您想支持另一种格式(例如 PDF 导出或类似格式),您只会头疼。当然,除非所有输出编码在您的应用程序中花费很长时间,并且您永远不需要纯文本。但在大多数情况下,这不太可能。
    • LINQ 使用 SqlParameters - 这些将清理并防止注入攻击。
    • @rocky:这是错误的印象。只有当数据的预期消费者已知时,才能执行清理。这就是为什么在存储到 SQL 之前转义 SQL 参数,并且在输出 HTML 之前编码 HTML 特殊字符的原因。更早地这样做只是被误导了。此外,我们掌握的所有数据都表明,这无论如何都不是一个网络应用程序。
    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2014-04-12
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多