Достаточно ли безопасен этот инъекционный динамический SQL для Doctrine2? - PullRequest
2 голосов
/ 20 марта 2012

Я знаю, что использование ORM, подобного Doctrine2 для построения запросов, безопасно , что означает, что параметры по умолчанию экранированы.

Но я предполагаю, что это не так очевидно при использовании литералов и когда этот литерал приходит непосредственно из строки запроса:

    $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 Ответ

1 голос
/ 20 марта 2012

$ 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 являются внутренними, то нет проблем. Если они исходят от пользователя, вам необходимо убедиться, что они действительны.

...