这个标题很糟糕。
我正在开发一个网站,其中使用 CSV 文件导入大量用户。该 CSV 文件包括名字、姓氏、电子邮件等。在将文件上传到数据库之前,我通过一个程序运行它,该程序获取姓氏并在 CSV 中附加 7 位数字的最后 4 位,并分配将其设置为密码值。当用户第一次登录时,它会重定向到一个页面,在该页面中输入新密码,该密码会使用 password_hash 函数进行哈希处理并存储在数据库中。然后它将它们重定向到主页。
在登录页面上,它首先使用他们输入的纯文本密码检查数据库(我知道这是一种糟糕的方法,我正在尝试找到另一种方法来执行此操作...留下您的答案也适用于此!)如果没有返回结果,那么它会在数据库中查询散列传递并将其存储在变量中。然后我运行password_verify函数,即使我知道我输入了正确的密码,它也会失败。我 var_dump(ed) 哈希值 var 并回显通过password_hash 函数输入的通行证。它们不匹配,我不知道为什么。这是相关代码。
if (!empty($_POST)){
$Lname = $_POST['Lname'];
$pass = $_POST['pass'];
//region prepare the mysqli statement and run it
//Prepare the query
$stmt = $con->prepare("SELECT id, Lname, password FROM users WHERE Lname = ? AND password = ?");
//Bind parameters
$stmt->bind_param("ss", $Lname, $pass);
//Run the query
$stmt->execute();
//Get results
$results = $stmt->get_result();
//Make results usable
$row = $results->fetch_object();
//endregion
//check to make sure results were returned and stores user id into session variable if true
if (!empty ($row)){
$_SESSION['user'] = $row->id;
unset($_POST);
header('Location: home.php');
}elseif (empty ($row)){
$hasho=$con->query('SELECT password FROM users WHERE Lname = "' .$Lname. '"');
$hash = $hasho->fetch_object();
$passh = password_hash($pass, PASSWORD_DEFAULT);
if ($passh == $hash) {
$_SESSION['user'] = $row->id;
unset($_POST);
header('Location: home.php');
}
else {
echo "Invalid credentials";
}
}
}
我确信我用这段代码做了一些非常愚蠢的事情。
谢谢!
最佳答案
您不能使用函数password_hash()来验证密码,因为盐是随机选择的。
$passh = password_hash($pass, PASSWORD_DEFAULT);
if ($passh == $hash) { // those hashes are never comparable
您应该使用password_verify()函数来检查密码:
if password_verify($pass, $hash) {
关于php - 尝试创建一个页面,如果是第一次登录,则检查纯文本密码,否则检查哈希密码(php),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31166676/