pdo для предотвращения внедрения sql

Я пытаюсь вставить вкладки посетителя в базу данных.
Это работает, но – настолько ли это достаточно для предотвращения внедрения sql?

<?php $db_host = "localhost"; $db_name = "db_qadenza"; $db_user = "root"; $odb = new PDO ("mysql:host=" . $db_host . ";dbname=" . $db_name, $db_user); if(isset($_POST['Submit'])) { $user = $_POST['user']; $pass = $_POST['pass']; $mail = $_POST['mail']; $confirm_key=md5(uniqid(rand())); $q = "INSERT INTO members (user, pass, mail, confirm_key) VALUES(:user, :pass, :mail, :confirm_key);"; $query = $odb->prepare($q); $results = $query->execute(array( ":user"=>$user, ":pass"=>$pass, ":mail"=>$mail, ":confirm_key"=>$confirm_key, )); exit(); } ?> 

В коде есть две проблемы.

  1. Вы используете эмулированные подготовленные заявления. Это поведение по умолчанию для драйвера PDO_MYSQL. Чтобы обойти это, вы должны добавить:

     $odb->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

    В сочетании с отсутствующей кодировкой для связи с БД, которая может сделать ваш код открытым для инъекций. Для установления соединения вы должны использовать:

     $odb = new \PDO('mysql:host=localhost;dbname=******;charset=UTF-8', 'user', 'pass'); 
  2. Ваш метод пароля хеширования небезопасен (или, фактически, не существует). Вместо этого вы должны использовать функцию crypt() с CRYPT_BLOWFISH или PBKDF2 и другую соль для каждого пароля.

Кроме того, вы можете использовать bindParam() для настройки использования именованных параметров, поскольку установка их через execute() будет связывать значения как PDO::PARAM_STR , но есть и другие варианты , которые могут оказаться полезными.

Да. метод prepare ($ query) гарантирует, что никакая SQL-инъекция не может иметь место, если пользовательские значения вводятся как переданные переменные, которые они для вас.

На связанной странице:

Если приложение использует исключительно подготовленные операторы, разработчик может быть уверен, что SQL-инъекция не произойдет […]

Да. Мне это хорошо.

Если вы захотите, вы также можете создать дополнительных пользователей mysql, чтобы ограничить область в случае SQL-инъекции. На данный момент вы подключаетесь как root .

Также изучите использование схемы хэширования пароля, например, salt + BCrypt.