【问题标题】:password_verify does not work密码验证不起作用
【发布时间】:2018-07-29 13:59:06
【问题描述】:

您好,我的验证密码 (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)

有人看出有什么问题吗?

【问题讨论】:

  • password_verify 应该是未散列的密码和数据库密码。
  • $pass == $conf_pass,这将始终为 false,$pass 将包含哈希,但 $conf_pass 将是普通密码。
  • 失败了^^我累了,谢谢大家。

标签: php password-hash


【解决方案1】:

请重新阅读password_verifydocumentation page

password_verify 不用于确认密码。它对第一个参数(带盐)进行哈希处理并将其与第二个参数进行比较:

bool password_verify ( string $password , string $hash )

$password:原始密码

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

返回值:密码是否正确。

注意 hash 参数,必须用password_hash 计算。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      一切都搞定了,

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

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

      【讨论】:

      • $verif_pass == $data['password'] 是如何工作的?数据库是散列的,不是吗?另外,该验证如何工作?纯文本不会 == 哈希值。
      猜你喜欢
      • 2018-07-18
      • 2016-08-16
      • 2018-06-10
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多