Php 密码验证不起作用

Php 密码验证不起作用,php,password-hash,Php,Password Hash,嗨,我的verif密码(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

嗨,我的verif密码(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(真实)


有人看到密码出错了吗?

请重新阅读密码\u验证

密码\u验证
不用于确认密码。它散列第一个参数(使用salt)并将其与第二个参数进行比较:

bool密码\u验证(字符串$password,字符串$hash)

$password
:原始密码

$hash
:哈希密码(通常从数据库查询)

返回值:密码是否正确

注意
hash
参数必须使用
password\u hash
计算,请重新阅读
password\u verify

密码\u验证
不用于确认密码。它散列第一个参数(使用salt)并将其与第二个参数进行比较:

bool密码\u验证(字符串$password,字符串$hash)

$password
:原始密码

$hash
:哈希密码(通常从数据库查询)

返回值:密码是否正确

注意
hash
参数必须使用
password\u hash

计算。您应该对涉及用户输入的所有数据库交互使用参数化查询

password\u verify
将参数1作为纯文本密码,将参数2作为散列值(通常是DB值)。因此,您需要更改该函数的用法。散列它只是为了存储

$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));

另外,如果只选择一列,请使用其名称,而不是
*
,这样可以节省资源。

您应该对涉及用户输入的所有数据库交互使用参数化查询

password\u verify
将参数1作为纯文本密码,将参数2作为散列值(通常是DB值)。因此,您需要更改该函数的用法。散列它只是为了存储

$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.');
} 
一切都完成了

我做了一个错误的替换,这是正确的代码:

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.');
} 

password\u-verify
应用于未删除的密码和DB密码。
$pass==$conf\u-pass
,这将始终是错误的,
$pass
将包含哈希,但
$conf\u-pass
将是普通密码。失败^我很累,谢谢大家。
password\u-verify
应该用于未修改的密码和DB密码。
$pass==$conf\u-pass
,这将始终是错误的,
$pass
将包含散列,但
$conf\u-pass
将是普通密码。失败^^我很累,谢谢大家。
$verif\u-pass=$data['password'
如何工作?数据库是散列的,不是吗?这又是如何验证的呢?纯文本不会==散列值。
$verif\u pass===$data['password']
如何工作?数据库是散列的,不是吗?这又是如何验证的呢?纯文本不会==散列值。