从 MYSQL 数据库检索后,PHP 中的哈希密码不是字符串

Posted

技术标签:

【中文标题】从 MYSQL 数据库检索后,PHP 中的哈希密码不是字符串【英文标题】:Hash Password in PHP not a string after retrieval from MYSQL database 【发布时间】:2021-08-12 22:47:48 【问题描述】:

我有登录部分的密码,使用$hash = password_hash($password, PASSWORD_DEFAULT);

密码以哈希的形式存储在数据库中,$2y$10$CaQON5WOEHcla58aBoIRKOmyYLBwtDHKFqk81y25.EGvjBqlF0W1W

我在登录页面查询数据库,检查用户邮箱在数据库中,确实是。

如果我使用的查询有效,我已经检查了 mysql 工作台,并且它返回密码正常。

但是,当我尝试在数据库中查询密码并将其分配给变量时,在回显该变量不是字符串时出现错误。

我试过$verify = password_verify($password, $hash); 但是,我也得到的错误是参数2必须是一个字符串。

那么为什么我得到它之后的值不是字符串呢?以及如何检索正确的值?

这是我的查询:

   $sql_e2 = "SELECT password FROM users WHERE email='$email'";
   $hash = mysqli_query($mysqli, $sql_e2);

谢谢

【问题讨论】:

请显示查询数据库并将密码哈希分配给变量的完整代码 - 在上面的 $hash = mysqli_query($mysqli, $sql_e2); 变量 $hash 将是一个布尔值 - 你需要 fetch 结果在分配变量之前 通过在 sql cmd 中直接使用 $email,您的代码似乎容易受到 sql 注入的影响 - 在使用用户提供的数据时使用 prepared statements 函数 mysqli_query() 没有返回您期望的值。成功时返回 mysqli_result 对象,失败时返回 false。所以,首先你必须检查它是否返回 false,然后处理 mysqli_result 对象(成功时),获取行(你可以使用 mysqli_fetch_row)。 【参考方案1】:

我完成了现在工作的汇总,并针对工作和非工作帐户进行了测试。

//query SQL for password
        $sql_e2 = $mysqli->prepare("SELECT password FROM users WHERE email = ?");
        $sql_e2->bind_param("s", $email);
        $sql_e2->execute();
        $result = $sql_e2->get_result();

        //fetch row from result and assign value
        $row = mysqli_fetch_row($result);
        $hash = $row[0] ?? false;

        // Print the result depending if they match
        if (password_verify($password, $hash)) 
            echo 'Password Verified!';
         else 
            echo 'Incorrect Password!';
        

感谢各位大侠指点。

【讨论】:

以上是关于从 MYSQL 数据库检索后,PHP 中的哈希密码不是字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何通过php中的忘记密码邮件获取实际密码?

从数据库中检索数据后如何操作数据

将密码转换为哈希 PHP

Android AsyncTask 无法从 php-mysql 检索 JSON 字符串

PHP,可以吗?将密码哈希中的字符串作为主键存储在数据库中?

jquery - 如何使用通过 AJAX 从 MySQL 和 PHP 检索的数据将图像添加到 Select2 下拉列表?