使用EntityRepository :: findBy()时是否需要转义值?

时间:2011-12-11 11:47:03

标签: escaping doctrine-orm

当使用Doctrine2的EntityRepository::findBy()时,我还需要转义我传入的值吗?

$em->getRepository('User')->findBy(array('name' => $_POST['name']));
                                                   ^ need to escape?

2 个答案:

答案 0 :(得分:5)

简短回答:不,你没有

答案很长:转义是一个低级别的数据库问题,像Doctrine这样的高级ORM摘要为你提供。使用Doctrine时,您应该只关心查询域模型,而不是关于如何将其转换为基础持久性技术(在本例中为SQL查询)。

答案 1 :(得分:1)

数据库库自然会触及SQL注入安全漏洞的类别。您应该仔细阅读以下信息,以了解Doctrine如何能够帮助您阻止SQL注入。

通常,您应该假设Doctrine中的API对用户输入不安全。但是有一些例外。

以下API旨在通过SQL注入进行SAFE:

  • 对于Doctrine\DBAL\Connection#insert($table, $values, $types)Doctrine\DBAL\Connection#update($table, $values, $where, $types)Doctrine\DBAL\Connection#delete($table, $where, $types),只有$values$where的数组值。 $ values和$ where的表名和键是 NOT 转义。
  • Doctrine\DBAL\Query\QueryBuilder#setFirstResult($offset)
  • Doctrine\DBAL\Query\QueryBuilder#setMaxResults($limit)
  • Doctrine\DBAL\Platforms\AbstractPlatform#modifyLimitQuery($sql, $limit, $offset)代表$limit$offset参数。

考虑所有其他API对用户输入不安全:

  • 连接上的查询方法
  • QueryBuilder API
  • 用于生成和执行DML / DDL SQL语句的Platforms和SchemaManager API

要在这些场景中转义用户输入,请使用Connection#quote()方法。

来源:http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/security.html