Я пытаюсь вставить вкладки посетителя в базу данных.
Это работает, но – настолько ли это достаточно для предотвращения внедрения 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(); } ?>
В коде есть две проблемы.
Вы используете эмулированные подготовленные заявления. Это поведение по умолчанию для драйвера PDO_MYSQL. Чтобы обойти это, вы должны добавить:
$odb->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
В сочетании с отсутствующей кодировкой для связи с БД, которая может сделать ваш код открытым для инъекций. Для установления соединения вы должны использовать:
$odb = new \PDO('mysql:host=localhost;dbname=******;charset=UTF-8', 'user', 'pass');
Ваш метод пароля хеширования небезопасен (или, фактически, не существует). Вместо этого вы должны использовать функцию crypt()
с CRYPT_BLOWFISH
или PBKDF2 и другую соль для каждого пароля.
Кроме того, вы можете использовать bindParam()
для настройки использования именованных параметров, поскольку установка их через execute()
будет связывать значения как PDO::PARAM_STR
, но есть и другие варианты , которые могут оказаться полезными.
Да. метод prepare ($ query) гарантирует, что никакая SQL-инъекция не может иметь место, если пользовательские значения вводятся как переданные переменные, которые они для вас.
На связанной странице:
Если приложение использует исключительно подготовленные операторы, разработчик может быть уверен, что SQL-инъекция не произойдет […]
Да. Мне это хорошо.
Если вы захотите, вы также можете создать дополнительных пользователей mysql, чтобы ограничить область в случае SQL-инъекции. На данный момент вы подключаетесь как root
.
Также изучите использование схемы хэширования пароля, например, salt + BCrypt.