这个小的Doctrine2动态SQL是否足够安全注入?

时间:2012-03-20 12:04:25

标签: sql doctrine symfony doctrine-orm

我知道使用像 Doctrine2这样的ORM构建查询是安全的,这意味着参数在默认情况下会被转义。

但是我猜这个使用文字并且这个文字直接来自查询字符串时不是那么明显:

    $builder = $this->getRepository()->createQueryBuilder('e');
    $request = $this->getRequest();

    // Loop each allowed filter field and check if exists in $request
    foreach($this->getFilterFields() as $filter) :

        // Skip falsy values in $request
        if(!$value = $request->get($filter)) continue;

        // Add OR LIKE %$value% where $value is GET paramter
        $like = $builder->expr()->literal("%$value%");
        $builder->orWhere($builder->expr()->like("e.$filter", $like));

    endforeach;

应该以某种方式改善安全吗?

1 个答案:

答案 0 :(得分:1)

$ queryBuilder-> expr返回一个ExpressionBuilder对象。在ExpressionBuilder里面我们找到:

public function literal($input, $type = null)
{
    return $this->connection->quote($input, $type);
}

所以文字确实被引用,应该可以使用。

我们还发现:

public function like($x, $y)
{
    return $this->comparison($x, 'LIKE', $y);
}
public function comparison($x, $operator, $y)
{
    return $x . ' ' . $operator . ' ' . $y;
}

$ y很好,因为它首先通过文字。关于$ x,我们要小心一点。只要你的filterFields是内部的,那就没问题了。如果他们来自用户,那么您需要确保它们有效。