从 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 中的哈希密码不是字符串的主要内容,如果未能解决你的问题,请参考以下文章
Android AsyncTask 无法从 php-mysql 检索 JSON 字符串
PHP,可以吗?将密码哈希中的字符串作为主键存储在数据库中?
jquery - 如何使用通过 AJAX 从 MySQL 和 PHP 检索的数据将图像添加到 Select2 下拉列表?