PHP密码验证问题

问题描述

当我尝试执行代码时,我收到了无效密码错误。我想提一下,我也使用相同的PASSWORD_BCRYPT函数进行注册。但是,当我在登录代码中实现它时,我没有获得成功。请告诉我我在做什么错,并帮助我修复错误

另一件事是,我输入的密码与演示用户注册时使用的密码相同/正确。这是登录代码

if(isset($_POST['login'])){

$user_name = ($_POST['user_name']);
$upassword = password_hash($_POST['password'],PASSWORD_BCRYPT);
$statement = $db->prepare("SELECT user_name,password,status FROM user_registration WHERE user_name = ?");
$statement->bind_param('s',$user_name);
$statement->execute();

$statement->bind_result($user_name,$password,$status);
$row = $statement->fetch(); //fetch DB results

if (!empty($row)) { // checks if the user actually exists(true/false returned)
    
    if (password_verify($upassword,$row['password'])) {
        echo 'Password is valid!';
    } else {
        echo 'Invalid password.';
    }


} else {
    echo "Entered data is invalid."; // User login details entered does not match any in DB
}

$statement->close();
}

解决方法

存储在您的表上的密码是散列版本吗?

verify_password的第一个参数是纯文本密码,在您的代码中,您正在对密码进行哈希处理并验证哈希值上的哈希值。

请参见php文档中的示例

<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf',$hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

将您的verify_password行更改为

password_verify($_POST['password'],$row['password'])

或者不要在开始时将其散列

$upassword = $_POST['password'];