Всем привет. Подскажите плз знающие люди, какие из вариантов запросов с PDO можно назвать безопасными с точки зрения SQL инъекций? Перевожу сайт на PDO и вроде информации много, но точного ответа для себя найти не могу... ВАРИАНТ 1 $name = $_GET['name'] //получаем значение из GET параметра. $go_sort ='AND user=:name'; // это часть логики в запросе $count = $db->prepare("SELECT * FROM tovar WHERE vid=1 $go_sort"); $count->execute([':name'=> $name]); ВАРИАНТ 2 if($_GET['name']=='ivan'){ // само соседство с переменной GET параметра пугает) $name ='AND user=ivan'; } $count = $db->query("SELECT * FROM tovar WHERE vid=1 $name"); ВАРИАНТ 3 $var = (int)$_GET['id']; $count = $db->query("SELECT * FROM tovar WHERE vid=1 AND user_id=$var"); Переменная $var получает значение из GET, но пройти могут только цифры. Значит ли это, что запрос варианта 3 тоже безопасен и без prepare->execute? ВАРИАНТ 4 $count = $db->prepare("SELECT * FROM tovar WHERE vid=1 AND user_id=:user_id"); $count->bindValue(':user_id', $user_id); $count->execute(); //тут сомнения в том, что не в execute данные, а в bindValue. ВАРИАНТ 5 $var = $_GET['id']; // не вдаваясь в подробности просто знайте, что в переменной $var цикл выводящий GET параметры выбранные пользователем в нужном количестве по ? в IN. $count = $db->prepare("SELECT * FROM tovar WHERE vid=1 AND user_id IN(?, ?, ?, ?,)"); $count->execute($var); На синтаксис прошу внимания не обращать. Могут быть не точности.
У ПДО есть плейсхолдеры которые по сути и будут защищать от sql инъекций, именно тернарный оператор ? и : точие. Если в запросе плейсхолдеры не будут использоваться то лучше всего выполнять его как query. PHP: $count = $db->prepare("SELECT * FROM `tovar` WHERE `vid` = 1 AND `user_id` IN(?, ?, ?, ?,)"); $count->execute([$var]);