首页 > 解决方案 > PHP 密码验证在 MySQLi 中无法正常工作

问题描述

我能够像这样散列和验证密码

<?php
    $password ="passss.com";
    $hash = password_hash($password, PASSWORD_DEFAULT);
    if (password_verify('passss.com', $hash)) {
         echo 'Password is valid!';
    } else {
      echo 'Invalid password.';
    }
?>

但是当我尝试在从 MySQL 查询数据时做同样的事情时,我总是得到Invalid password

我只是$hash在 PHP 文件中创建并手动将其插入 MySQL 表中。

if (!isset($_POST['username'], $_POST['password'])) {
    die('Please fill both the username and password field!');
}
if ($stmt = $con->prepare('SELECT id, userpassword FROM users WHERE useremail = ?')) {
    $stmt->bind_param('s', $_POST['username']);
    $stmt->execute();
    $stmt->store_result();
    if ($stmt->num_rows > 0) {
        $stmt->bind_result($id, $userpassword);
        $stmt->fetch();
        if (password_verify($_POST['password'], $userpassword)) {
            $_SESSION['loggedin'] = true;
            echo "Password is valid";
        } else {
            echo "Invalid password.";
        }
    } else {
        echo 'Incorrect username!';
    }
}

标签: phpformssessionmysqlipasswords

解决方案


您确定使用 php 构建函数正确散列密码。就像是

$password=$_POST['password'];
$options = array("cost"=>4);
$hashPassword = password_hash($password,PASSWORD_BCRYPT,$options);

// 这里传递$hashPassword并插入数据库

我已经在下面的链接中回答了这个问题,您可以在其中学习注册、验证密码哈希然后登录

提交密码的最佳做法是什么?


推荐阅读