データベースでパスワード ハッシュが更新されないという問題が少しあり、何が間違っていたのかを確認するのに苦労しています。誰かがそれを助けることができれば、それは大歓迎です。
基本的に、私はlogin.phpスクリプトを持っています.md5とsaltをユーザーのパスワードに使用し、それをmysql dbに保存していましたが、これは古くなっています。そのため、最近、次回のログイン時にユーザーのパスワードを PHP password_hash に更新するように更新しようとしました。
最初にポスト経由でパスワードを収集し、次にデータベースを呼び出してデータベース内のハッシュと比較します。パスワードが検証されたら、password_needs_rehash を使用して db パスワードを実行し、再ハッシュが必要かどうかを確認します。そうであれば、新しい has を生成し、これを変数に格納して、最後にログインした時間とともにハッシュを更新する mysqli 準備済みステートメントを実行します。そうでない場合は、db を前回のログイン。
新しいハッシュの更新に失敗したようですが (生成されていることを確認しましたが)、クエリの時刻は更新されます。例外コードや報告する 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 ステートメントまで実行されているようです。
明らかなタイプミスを見逃したか、どこかでロジックが間違っているとしか思えません。
いつも助けていただきありがとうございます。