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 在存储到数据库之前截断 Json 中的字符串
Symfony2 / Doctrine中的实体和模型有啥区别
Symfony2 / Doctrine 使 $statement->execute() 不“缓冲”所有值