За последние 24 часа нас посетили 57230 программистов и 1806 роботов. Сейчас ищут 893 программиста ...

PDO и sql инъекции - PHP БД

Тема в разделе "PHP и базы данных", создана пользователем olejan1991, 27 апр 2016.

Метки:
  1. olejan1991

    olejan1991 Активный пользователь

    С нами с:
    27 фев 2012
    Сообщения:
    25
    Симпатии:
    0
    Изучаю PDO и защиту от инъекций. Как понял если использовать для вставки в БД данных prepare, то инъекции будут исключены. я правильно это понял?

    читая эту статью http://ruseller.com/lessons.php?id=610&rub=28 сделал метод, и по идее эта вставка защищена от инъекций, так?

    PHP:
    1. public function create($name, $tablename) {
    2.         $tablename = DB_PREFIX . $tablename;
    3.         $fields = $_POST[$name];
    4.         foreach ($fields as $key => $value) {
    5.             if ($key != 'load') {
    6.                 $rows[] = "`" . $key . "`";
    7.                 $values[] = "?";
    8.                 $data[] = $value;
    9.             }
    10.         }
    11.         $rows = implode(',', $rows);
    12.         $values = implode(',', $values);
    13.         $db = db::getDB();
    14.         $sql = "INSERT INTO `$tablename` ($rows) VALUES ($values)";
    15.         $st = $db->prepare($sql);      
    16.         return $st->execute($data);
    17.     }
    использую в этом методе из той статьи

    # неименованые шаблоны
    $STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?);

    Или лучше использовать именованный шаблон?

    PHP:
    1. public function create($name, $tablename) {
    2.         $tablename = DB_PREFIX . $tablename;
    3.         $fields = $_POST[$name];
    4.         foreach ($fields as $key => $value) {
    5.             if ($key != 'load') {
    6.                 $rows[] = "`" . $key . "`";
    7.                 $values[] = ":" . $key;
    8.                 $data[$key] = $value;
    9.             }
    10.         }
    11.         $rows = implode(',', $rows);
    12.         $values = implode(',', $values);
    13.         $db = db::getDB();
    14.         $sql = "INSERT INTO `$tablename` ($rows) VALUES ($values)";
    15.         $st = $db->prepare($sql);
    16.         return $st->execute($data);
    17.     }
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    это просто два подхода разных, с именами можно в любом порядке в массиве данные передавать в аргумент
     
  3. olejan1991

    olejan1991 Активный пользователь

    С нами с:
    27 фев 2012
    Сообщения:
    25
    Симпатии:
    0
    т. е. в данном методе вставка в бд защищена от инъекций в обоих случаях, так?
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    через prepare да, но что-то подозрительно там из $_POST. нет возможности пользователю передавать свои имена столбцов для базы?
     
  5. olejan1991

    olejan1991 Активный пользователь

    С нами с:
    27 фев 2012
    Сообщения:
    25
    Симпатии:
    0
    там по такой системе работает.

    например есть форма

    HTML:
    1. <form action="/auth" method="POST">
    2.  
    3. <input type="login" name="Reg[login]">
    4. <input type="pass" name="Reg[pass]">
    5.  
    6. <input type="sumit" value="Добавить">
    7.  
    8. </form>
    action обрабатывает контроллер, в методе которого обращаемся к методу модели описанного в первом сообщении

    PHP:
    1. $model->create("Reg","users")

    Возможна ли в таком случае инъекция?
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    с фига бы она защищена? =)
    может я тупой и не пользуюсь этим делом, но фактически по коду я вижу, что там вообще нет никакой защиты.
     
  7. olejan1991

    olejan1991 Активный пользователь

    С нами с:
    27 фев 2012
    Сообщения:
    25
    Симпатии:
    0
    хз, prepare и все дела. вот и пытаюсь узнать так будет защищена или нет.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Чудак, prepare это не волшебное заклинание. Его надо использовать не после подстановки значений в строку, а ВМЕСТО подстановки. Ты официальные доки почитай, вместе с примерами и комментариями.
    --- Добавлено ---
    Нет никакой возможности забиндить имена столбцов. То есть да, их придется вклеивать до prepare. Но в таком случае, брать их можно только из "белого списка" разрешенных имён. Иначе тебе такого присунут, что мало не покажется.

    А если хорошенько подумать, то скорее всего такая мега-универсальная функция и не нужна вовсе. В своей Модели ты работаешь с заранее известными таблицами и столбцами, а не с какими-то случайными, каких пользователь попросит.
     
  9. olejan1991

    olejan1991 Активный пользователь

    С нами с:
    27 фев 2012
    Сообщения:
    25
    Симпатии:
    0

    т.е. нужно тут проверять на инъекции?

    PHP:
    1. foreach($fieldsas$key=>$value){
    2.            if($key!='load'){
    3.                $rows[]="`".$key."`";
    4.                $values[]=":".$key;
    5.                $data[$key]=$value;
    6.            }
    7.        }
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    защищать, а не проверять. Да, тут.
     
  11. olejan1991

    olejan1991 Активный пользователь

    С нами с:
    27 фев 2012
    Сообщения:
    25
    Симпатии:
    0
    Спасибо!