DBAL QueryBuilder: как безопаснее избежать инъекций SQL? - PullRequest
0 голосов
/ 18 января 2020

Согласно документации DBAL, только методы setFirstResult и setMaxResults предназначены для защиты от SQL инъекций. Но в разделе QueryBuilder упоминается, что для безопасной работы с QueryBuilder мы должны передавать пользовательские входные данные с помощью метода setParameter. Итак, я вижу 2 способа сделать это, но я не знаю, есть ли у них реальная разница или нет: Способ 1:

$qb->select('USR_id', 'USR_email')
->from('T_user_USR')
->where('USR_email = ? ')
->setParameter(0, $email);
$stmtQb = $qb->execute();
$results = $stmtQb->fetchAll();

Способ 2:

$qb->select('USR_id', 'USR_email')
->from('T_user_USR')
->where('USR_email = ? ');
$stmtQb = $dbal->prepare($qb->getSQL());
$stmtQb->bindValue(1, $email);
$stmtQb->execute();
$results = $stmtQb->fetchAll();

Что лучше способ сделать это? Заранее спасибо

1 Ответ

0 голосов
/ 18 января 2020

Два примера в конечном итоге делают то же самое. То есть, когда вы используете setParameter() значение параметра связывается с оператором, используя bindValue().

См. https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Connection.php#L1326 -L1356 для внутренней функции, которая делает это в DBAL.

Единственная причина использовать вторую форму - если вы хотите использовать bindParam() вместо bindValue(). Это можно сделать, если вы хотите связать параметр с переменной PHP по ссылке, например, чтобы вы могли подготовить запрос один раз перед запуском al oop, а затем выполнить его много раз в l oop.

Оба метода обеспечивают одинаковую степень защиты по отношению к SQL впрыску.

...