Symfony/Doctrine 中的 SQL 注入

Posted

技术标签:

【中文标题】Symfony/Doctrine 中的 SQL 注入【英文标题】:SQL injection in Symfony/Doctrine 【发布时间】:2012-07-17 10:12:28 【问题描述】:

使用参数而不是直接在查询字符串中放置值是为了防止 SQL 注入攻击,应始终为done:

... WHERE p.name > :name ...
->setParameter('name', 'edouardo')

这是否意味着如果我们使用这样的参数,我们将始终受到 SQL 注入的保护?在使用表单(FOS 的注册表单)时,我输入了<b>eduardo</b>,并将其与标签一起保存到数据库中。我真的不明白为什么使用参数可以防止 SQL 注入...

为什么标签会这样持久化到数据库中?有没有办法通过使用 Symfony 的验证组件来删除标签?

在 Symfony 中将数据持久化到数据库之前,我们应该使用什么通用提示或方法?

【问题讨论】:

你在哪里看到<b>eduardo</b>中的SQL? 【参考方案1】:

从阅读what's SQL injection开始。

SQL 注入攻击发生在 SQL 中的值改变查询时。结果,查询执行了它打算执行的其他操作。

示例将使用 edouardo' OR '1'='1 作为值,这将导致:

WHERE p.name > 'edouardo' OR '1'='1'

(因此条件始终为真)。

"eduardo" 是一个完全有效的值。在某些情况下,您可能希望将其保存为已提交(例如内容管理系统)。当然,当您从数据库中获取 html 并直接输出时,它可能会破坏您的 HTML。这应该由您的模板引擎解决(twig 会自动转义它)。

如果您想在将数据从表单传递到实体之前处理数据,请使用data transformers。

【讨论】:

感谢 Jakub,我现在看到了两者之间的区别。非常感谢。【参考方案2】:

如果您在创建请求时使用参数而不是串联,则程序能够区分 SQL 关键字和值。因此,它可以安全地转义可能包含恶意 SQL 代码的值,这样该恶意代码就不会被执行,而是存储在字段中,就像它应该的那样。

HTML 代码注入是另一个问题,它与数据库无关。这个问题在显示值时解决了,通过使用自动输出转义,将显示<b>eduardo</b> 而不是 eduardo。这样,任何恶意的 js / html 代码都不会被解释:它会被显示出来。

【讨论】:

谢谢gregoire,现在一切都有意义了

以上是关于Symfony/Doctrine 中的 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章

Symfony Doctrine 语法错误或访问冲突:

Symfony,Doctrine 在存储到数据库之前截断 Json 中的字符串

Symfony2 / Doctrine中的实体和模型有啥区别

Symfony2 / Doctrine 使 $statement->execute() 不“缓冲”所有值

如何从 Symfony2 和 Doctrine2 中的一个点保存和检索纬度和经度

Symfony - Doctrine 实体的返回类型