当使用Doctrine2的EntityRepository::findBy()
时,我还需要转义我传入的值吗?
$em->getRepository('User')->findBy(array('name' => $_POST['name']));
^ need to escape?
答案 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对用户输入不安全:
要在这些场景中转义用户输入,请使用Connection#quote()
方法。
来源:http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/security.html