Изучаю PDO и защиту от инъекций. Как понял если использовать для вставки в БД данных prepare, то инъекции будут исключены. я правильно это понял? читая эту статью http://ruseller.com/lessons.php?id=610&rub=28 сделал метод, и по идее эта вставка защищена от инъекций, так? PHP: public function create($name, $tablename) { $tablename = DB_PREFIX . $tablename; $fields = $_POST[$name]; foreach ($fields as $key => $value) { if ($key != 'load') { $rows[] = "`" . $key . "`"; $values[] = "?"; $data[] = $value; } } $rows = implode(',', $rows); $values = implode(',', $values); $db = db::getDB(); $sql = "INSERT INTO `$tablename` ($rows) VALUES ($values)"; $st = $db->prepare($sql); return $st->execute($data); } использую в этом методе из той статьи # неименованые шаблоны $STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?); Или лучше использовать именованный шаблон? PHP: public function create($name, $tablename) { $tablename = DB_PREFIX . $tablename; $fields = $_POST[$name]; foreach ($fields as $key => $value) { if ($key != 'load') { $rows[] = "`" . $key . "`"; $values[] = ":" . $key; $data[$key] = $value; } } $rows = implode(',', $rows); $values = implode(',', $values); $db = db::getDB(); $sql = "INSERT INTO `$tablename` ($rows) VALUES ($values)"; $st = $db->prepare($sql); return $st->execute($data); }
это просто два подхода разных, с именами можно в любом порядке в массиве данные передавать в аргумент
через prepare да, но что-то подозрительно там из $_POST. нет возможности пользователю передавать свои имена столбцов для базы?
там по такой системе работает. например есть форма HTML: <form action="/auth" method="POST"> <input type="login" name="Reg[login]"> <input type="pass" name="Reg[pass]"> <input type="sumit" value="Добавить"> </form> action обрабатывает контроллер, в методе которого обращаемся к методу модели описанного в первом сообщении PHP: $model->create("Reg","users") Возможна ли в таком случае инъекция?
с фига бы она защищена? =) может я тупой и не пользуюсь этим делом, но фактически по коду я вижу, что там вообще нет никакой защиты.
Чудак, prepare это не волшебное заклинание. Его надо использовать не после подстановки значений в строку, а ВМЕСТО подстановки. Ты официальные доки почитай, вместе с примерами и комментариями. --- Добавлено --- Нет никакой возможности забиндить имена столбцов. То есть да, их придется вклеивать до prepare. Но в таком случае, брать их можно только из "белого списка" разрешенных имён. Иначе тебе такого присунут, что мало не покажется. А если хорошенько подумать, то скорее всего такая мега-универсальная функция и не нужна вовсе. В своей Модели ты работаешь с заранее известными таблицами и столбцами, а не с какими-то случайными, каких пользователь попросит.
т.е. нужно тут проверять на инъекции? PHP: foreach($fieldsas$key=>$value){ if($key!='load'){ $rows[]="`".$key."`"; $values[]=":".$key; $data[$key]=$value; } }