password_verify не работает
Привет, у меня есть проблема с проверенным паролем (PHP-7).
это мой код:
if(isset($_POST['change_pass'])){
global $conn;
$id = '1';
$pass = password_hash($_POST['pass'], PASSWORD_DEFAULT);
$conf_pass = $_POST['conf_pass'];
$verif_pass = $_POST['verif_pass'];
$query = $conn->query("SELECT * FROM bdd WHERE id='$id'");
$data = $query->fetch(PDO::FETCH_ASSOC);
if(!empty($pass) && !empty($conf_pass) && !empty($verif_pass)){
if(password_verify($conf_pass, $pass)){
if($pass == $conf_pass){
$update = $conn->query("UPDATE bdd SET password='$pass' WHERE id='$id'");
if($update){
echo 'Mot de passe changé';
}else{
echo 'Erreur SQL';
}
}else{
echo 'Les mots de passe ne correspondent pas'; var_dump(password_verify($conf_pass, $pass));
}
}else{
echo 'La confirmation du mot de passe actuelle est erronée';
}
}else{
echo 'Vous devez compléter tous les champs';
}
}
и сообщение об ошибке таково: Les mots de passe ne корреспондент pasbool(true)
кто-то видит, что Ват не прав?
3 ответа
Пожалуйста, перечитайте password_verify
страница документации.
password_verify
не для подтверждения пароля. Он хэширует первый аргумент (с солью) и сравнивает его со вторым аргументом:
bool password_verify ( string $password , string $hash )
$password
: Необработанный пароль
$hash
: Хешированный пароль (обычно запрашивается из БД)
возвращаемое значение: правильный пароль или нет.
УВЕДОМЛЕНИЕhash
аргумент, должен быть рассчитан с password_hash
,
Вы должны использовать параметризованные запросы для всех взаимодействий с БД, включая ввод данных пользователем.
password_verify
принимает параметр 1 в качестве простого текстового пароля и параметр 2 в качестве хешированного значения (обычно это значение БД). Так что вам нужно изменить использование этой функции. Хеш это только для хранения.
$pass = $_POST['pass'];
$conf_pass = $_POST['conf_pass'];
$verif_pass = $_POST['verif_pass'];
$query = $conn->prepare("SELECT password FROM bdd WHERE id=?");
$query->execute(array($id));
$data = $query->fetch(PDO::FETCH_ASSOC);
if(!empty($pass) && !empty($conf_pass) && !empty($verif_pass)){
if(password_verify($pass, $data['password'])){
$update = $conn->query("UPDATE bdd SET password= ? WHERE id= ?");
$update->execute(array(password_hash($pass, PASSWORD_DEFAULT), $id));
Также, если выбран только один столбец, используйте его имя, а не *
это сэкономит вам ресурсы.
Все сделано,
Я должен сделать плохую замену, это правильный код:
if(!empty($pass) && !empty($conf_pass) && !empty($verif_pass)){
if($verif_pass == $data['password']){
if($conf_pass == $_POST['pass']){
$update = $conn->query("UPDATE hyona_ftelecom_web_users SET password='$pass', first_connect='1' WHERE phone='$phone'");
if($update){
notify('success','Succès','Votre mot de passe a bien été changer.');
}else{
notify('danger','Erreur','Erreur SQL.');
}
}else{
notify('warning','Attention','Les mots de passe ne correspondent pas.');
}
}else{
notify('warning','Attention','La confirmation du mot de passe actuelle est erronée.');
}
}else{
notify('warning','Attention','Vous devez compléter tous les champs.');
}