PDO: Защита от SLQ инъекций

215
30 мая 2018, 04:20

Насколько я знаю, использование prepared statement уже само по себе гарантированная защита от SQL инъекций (т.к. данные посылаются на сервер отдельно от запроса и сервер делает все необходимое, что бы экранировать данные).

Однако, использование prepared намного более объемное по коду чем использование PDO::query для единичных запросов. Сравним:

$stmt = $DBH->prepare("SOME SQL QUERY");
$stmt->execute($array_with_data);
$result = fetchAll();

Или даже так:

$stmt = $DBH->prepare("SOME SQL QUERY");
$stmt->bindParam('param1', $param1);
$stmt->bindParam('param2', $param2);
$stmt->bindParam('param3', $param3);
$stmt->execute();
$result = fetchAll();

Сравним с тем же самым, что получается при использовании просто PDO::query:

$result = $DBH->query("SOME SQL QUERY WITH DATA")->fetchAll();

И ВСЕ :)

Кроме того, приготовленные запросы сложнее отлаживать, ибо финального запроса как такового просто не существует. А для обычных запросов всегда можно их вывести и посмотреть что там не так (где там кавычка пропущена, запятая и т.д.).

Однако, я так понимаю, второй вариант никак не защищает от инъекций, если данные в запросе заранее не были правильно экранированы.

Вопросы:

  1. Правильно ли я понимаю, что PDO::prepare - достаточная защита от инъекций?
  2. Верно ли то, что PDO::query НЕ является защищенным от инъекций, если данные предварительно не были дополнительно экранированы?
  3. Есть ли способ выполнять запросы и не так длинно как prepare->execute->fetchAll, но в то же время защищаться от инъекций?
READ ALSO
Доступ к объекту в jQuery

Доступ к объекту в jQuery

Есть скрипт:

185
Торговля на PHP [закрыт]

Торговля на PHP [закрыт]

Кто сталкивался или знает есть ли на PHP реализации торговли, управление остатками и тому подобное? Есть ли вообще в природе подобные проекты?...

194
Проблемы с pagination Yii2 gridview

Проблемы с pagination Yii2 gridview

У меня стоит kartik-v/grid и он выводит только 10 страниц

238