我遇到了一个小问题,数据库中的密码哈希没有更新,我很难看出我做错了什么。如果有人能帮忙,我们将不胜感激。
基本上,我有一个login.php脚本,它过去只对用户的密码使用md5和salt,并将其存储在mysql数据库中,我知道它已经过时了。所以我最近尝试更新它,以便在用户下次登录时将密码更新为PHP password_hash
我首先通过post收集密码,然后调用数据库将其与数据库中的哈希进行比较。如果密码验证,则通过password_needs_rehash运行数据库密码,以检查是否需要重新哈希。如果它这样做了,那么它将生成一个新的has,并将其存储到一个变量中,该变量将通过mysqli准备的语句运行,该语句会随着他们上次登录的时间更新哈希,否则它只会使用上次登录更新数据库。
它似乎无法更新新的哈希(尽管我已经检查了它是生成的),但仍然更新了查询中的时间。没有来自异常代码的电子邮件或任何php错误需要报告。
// Check if a newer hashing algorithm is available or if the cost has changed
if (password_needs_rehash($dbpass, PASSWORD_DEFAULT, $cost)) {
// If so, create a new hash, and replace the old one
$newHash = password_hash($password, PASSWORD_DEFAULT, $cost);
}
//update last login date
date_default_timezone_set("Europe/London");
$servertime = date("Y-m-d H:i:s");
// connect to db for mysqli
require('../dbconn/user.php');
// query to update password, increment number of logins and set last login date for user
$update_pass_stmt = $mysqli->stmt_init();
// if new hash has been generated
if (isset($newHash)) {
$q = "UPDATE users SET theirpassword=?, lastlogin=? WHERE email=? LIMIT 1";
if ($update_pass_stmt->prepare($q)) {
$update_pass_stmt->bind_param('sss', $newHash, $servertime, $email);
$update_pass_stmt->execute();
$update_pass_stmt->close();
}
} else {
$q = "UPDATE users SET lastlogin=? WHERE email=? LIMIT 1";
if ($update_pass_stmt->prepare($q)) {
$update_pass_stmt->bind_param('ss', $servertime, $email);
$update_pass_stmt->execute();
$update_pass_stmt->close();
}
}
if ($mysqli->error) {
try {
throw new Exception("MySQL error $mysqli->error <br> Query:<br> $q", $mysqli->errno);
} catch(Exception $e) {
$mess = "Error No: ".$e->getCode(). " - ". $e->getMessage() . "<br >";
$mess .= nl2br($e->getTraceAsString());
$contact_email = "webmaster@example.co.uk";
$message_sub = "Mysqli Login Query Error [EN-UUTIME01]";
$hdrs = "From: " . $contact_email . "'r'n";
$hdrs .= "Reply-To: ". $contact_email . "'r'n";
$hdrs .= "MIME-Version: 1.0'r'n";
$hdrs .= "Content-Type: text/html; charset=UTF-8'r'n";
mail($contact_email, $message_sub, $mess, $hdrs);
}
$mysqli->close();
$_SESSION['internalerror'] = TRUE;
header("Location: ". $MM_redirectLoginFailed );
exit();
}
$mysqli->close();
我在代码的每一部分都进行了重复,它似乎一直运行到正确的sql语句。
我只能认为我要么漏掉了一个明显的打字错误,要么我的逻辑错了。
感谢您的帮助。
尽管很尴尬,但我找到了问题的解决方案。我传递到查询中的电子邮件变量为空。我在代码的早些时候给它起了不同的名字!尽管如此,为什么我没有在任何地方收到查询错误电子邮件或日志,我仍然不确定。。。请参阅上面我对@RyanVincent的评论。
感谢大家花时间仔细查看代码!