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

问题描述 投票:0回答:2

使用Doctrine2的

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

$em->getRepository('User')->findBy(array('name' => $_POST['name']));
                                                   ^ need to escape?
escaping doctrine-orm
2个回答
6
投票

简短回答:不,你不

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

有关 Doctrine ORM 安全性的详细信息可以在这里

找到

0
投票

数据库自然会涉及到 SQL 注入安全漏洞一类。您应该仔细阅读以下信息,以了解 Doctrine 如何帮助您防止 SQL 注入,以及如何不能帮助您防止 SQL 注入。

一般来说,您应该假设 Doctrine 中的 API 对于用户输入来说是不安全的。不过也有一些例外。

以下 API 旨在安全地防止 SQL 注入:

  • 对于
    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 上的查询方法
  • QueryBuilder API
  • 用于生成和执行 DML/DDL SQL 语句的平台和 SchemaManager API

要在这些场景中转义用户输入,请使用

Connection#quote()
方法。

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

© www.soinside.com 2019 - 2024. All rights reserved.