4

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

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

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

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

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

4

2 回答 2

10

从阅读什么是 SQL 注入开始。

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

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

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

(因此条件始终为真)。

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

如果您想在将数据从表单传递到您的实体之前处理数据,请使用数据转换器

于 2012-07-18T11:54:28.187 回答
6

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

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

于 2012-07-18T11:51:52.640 回答