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.');
} 
Другие вопросы по тегам