【问题标题】:Issue with password_hash and password_verify, always returning true in one case, false in anotherpassword_hash 和 password_verify 的问题,在一种情况下总是返回 true,在另一种情况下返回 false
【发布时间】:2023-03-10 10:20:02
【问题描述】:

我正在使用 password_hash 来保护数据库中的密码,但是当我使用 password_verify 时,它不匹配。在第一种情况下,我使用 password_verify 来连接用户,它总是返回 true,即使它不是好的密码。在第二种情况下,当用户想要更改他的密码时,我使用 password_verify,他被要求提供他的实际密码来更改它。在这种情况下,它总是返回 false,即使我以与连接相同的方式使用 password_verify。

在我的数据库中,密码存储为 VARCHAR(60)。我也试过VARCHAR(255),没什么区别。

这是我在用户创建帐户时如何使用 password_hash :

if(isset($_POST['username']) && isset($_POST['password']) && isset($_POST['psw-confirmation'])) {

        $username = htmlspecialchars($_POST['username']);
        $password = htmlspecialchars($_POST['password']);
        $pswConfirmation = htmlspecialchars($_POST['psw-confirmation']);

        if($password == $pswConfirmation) {

            // Connection to database
            require('database-connection.php');

            $request = $database->prepare("SELECT * FROM users WHERE username = :username");
            $request->execute(array(
                ":username" => $username
            ));
            $return = $request->fetch();

            // If the username doesn't exist yet in the database
            if(!$return) {
                $request->closeCursor();

                $hash = password_hash($password, PASSWORD_BCRYPT);

                $addProfile = $database->prepare("INSERT INTO users(username, password) VALUES(:username, :password)");
                $addProfile->execute(array(
                    ":username" => $username,
                    ":password" => $hash
                ));

我猜这部分运行良好,因为我的数据库中确实有一个散列密码:$2y$10$AFV2zouzirBhS30tCCRx9uyZDNMGSJWffUbXMO876T/9nJ8UDQJRi

这是我验证连接密码的方法:

if(isset($_POST['username']) && isset($_POST['password'])) {

        $username = htmlspecialchars($_POST['username']);
        $password = htmlspecialchars($_POST['password']);

        // Connection to database
        require('database-connection.php');

        $request = $database->prepare("SELECT * FROM users WHERE username = :username");
        $request->execute(array(
            ":username" => $username
        ));
        $return = $request->fetch();
        $hash = $return['password'];

        // If the username exists in the database
        if($return) {

            // And if the password match            
            if(password_verify($password, $hash)) { 
                echo "connected";
            }

当用户想要更改密码时,我如何验证密码: if(isset($_POST['actual-psw']) && isset($_POST['new-psw']) && isset($_POST['confirm-psw'])) {

        $actualPsw = htmlspecialchars($_POST['actual-psw']);
        $newPsw = htmlspecialchars($_POST['new-psw']);
        $confirmPsw = htmlspecialchars($_POST['confirm-psw']);

        // Connection to database
        require('database-connection.php');

        $request = $database->prepare("SELECT * FROM users WHERE id = :id");
        $request->execute(array(
            ':id' => $_SESSION['id']
        ));
        $return = $request->fetch();
        $hash = $return['password'];

        if(password_verify($actualPsw, $hash)) {
            echo "success";
        } else {
            echo "fail";
        }

$_SESSION['id'] 正在返回实际用户的正确 ID。

我不明白为什么它不起作用,这让我更加困惑,在一种情况下它总是正确的,而在另一种情况下它总是错误的,因为我在两种情况下都使用了相同的方式。

【问题讨论】:

  • 我知道这里有很多类似的问题,即使是在 stackoverflow 之外,但没有一个能解决我的问题。

标签: php password-hash


【解决方案1】:

我发现我的错误在哪里;

我有这个 database-connection.php 文件:

$host = 'localhost';
$dbname = 'japonwebsite';
$user = 'root';
$password = 'mysql';

try
{
  $database = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, 
  $password);
}
catch (Exception $e)
{
  die('Erreur : ' . $e->getMessage());
}

我在需要连接到数据库的所有页面上都包含此文件,因此我将其包含在页面中以将用户添加到数据库和验证登录的页面。

问题是,在这两个页面上,我都在使用$password = $_POST['password']; 将用户在登录或注册表单上输入的密码存储在一个变量中。

在那之后,我正在做include('database-connection.php'); 连接到数据库。所以$password 总是等于mysql,因为我在database-connection.php 中也有一个变量$password。所以我一直在数据库中添加“mysql”的hash,并且一直验证数据库中的hash是否等于“mysql”,所以一直都是这样。我刚刚重命名了数据库连接中的变量 $password 来修复它!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2016-03-02
    • 2018-04-26
    相关资源
    最近更新 更多