データベースで更新されていないパスワードハッシュに関する問題が少しありました。誰かがそれを助けることができればそれは非常に高く評価されるだろうパスワードハッシュが更新されないのはなぜですか?Mysqli Prepared Statement
私は基本的に、ユーザーのパスワードにmd5とsaltを使用してmysql dbに格納するlogin.phpスクリプトを用意しています。これは古くなっています。だから、私は最近、ユーザーパスワードを次回のログイン時にPHP password_hashに更新するように更新しようとしました。
私はまずポストからパスワードを収集し、dbを呼び出してデータベースのハッシュと比較します。パスワードが確認されたら、パスワード再入力が必要かどうかをpassword_needs_rehashで確認します。そうであれば、新しいhasを生成し、最後にログインした時刻とともにhashを更新する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 = "[email protected]";
$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文まで実行されているようです。
私は明らかなタイプミスを覚えていないと思っています。あるいは、私のロジックがどこかに間違っていると思います。
ご協力いただきありがとうございます、ありがとうございます。
はパスワードがデータベースに文字列として保存されていますか? – RST
ええ、それらはphp.netの推奨に従ってvarchar(255)として保存されています – BottyZ
ユーザーがもうログインしないとどうなりますか?その後、パスワードがMD5ハッシュであるため、データベースが盗まれたときに脆弱になります。 – st2erw2od