За последние 24 часа нас посетили 21784 программиста и 1690 роботов. Сейчас ищут 1918 программистов ...

PDO и безопасные запросы

Тема в разделе "PHP и базы данных", создана пользователем Артур23, 7 май 2018.

  1. Артур23

    Артур23 Новичок

    С нами с:
    7 май 2018
    Сообщения:
    1
    Симпатии:
    0
    Всем привет. Подскажите плз знающие люди, какие из вариантов запросов с 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);

    На синтаксис прошу внимания не обращать. Могут быть не точности.
     
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    У ПДО есть плейсхолдеры которые по сути и будут защищать от sql инъекций, именно тернарный оператор ? и : точие. Если в запросе плейсхолдеры не будут использоваться то лучше всего выполнять его как query.
    PHP:
    1. $count = $db->prepare("SELECT * FROM `tovar` WHERE `vid` = 1 AND `user_id` IN(?, ?, ?, ?,)");
    2. $count->execute([$var]);
     
    #2 _ne_scaju_, 10 май 2018
    Последнее редактирование: 10 май 2018