Bir veritabanında bir şifre karmasının güncellenmemesiyle ilgili bir sorunum var ve yanlış yaptığımı görmek için uğraşıyorum. Eğer kimse yardım ederse çok takdir edecekti.Neden parola karesi güncellenmiyor .... Mysqli Hazır Bildirimi
Temelde, sadece bir kullanıcı şifresine md5 ve tuz alıp, güncelliğini bildiğim bir mysql db dosyasında saklayan bir login.php betiğim var. Bu yüzden, bir sonraki oturum açtıklarında kullanıcı şifrelerini PHP password_hash'a güncellemek için güncellemeyi denedim.
Önce şifreyi parola ile topladım ve db'de karma ile karşılaştırmak için db'yi aradım. Parola doğrularsa, yeniden şifrelemenin gerekip gerekmediğini kontrol etmek için db şifresini password_needs_rehash üzerinden çalıştırın. Eğer yaparsa o zaman yeni bir tane oluşturacak ve bunu en son oturum açtıkları süre ile birlikte güncellemeyi sağlayan bir mysqli hazırlanmış ifadesiyle çalıştırılacak bir değişkene saklayacaktır, aksi takdirde sadece db'yi son giriş.
Yeni hash'ı güncelleştiremediğimizde (her ne kadar üretildiğini kontrol etsem de), ancak sorgudaki zamanı güncelleştirmeye devam ediyor. Kural dışı durum kodundan veya raporlanacak herhangi bir php hatasından gelen e-postalar yoktur.
// 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();
ben kod her bölümde dışarı yankılandı ettik ve doğru sql açıklamaya çalışan gibi görünüyor.
Sadece bir bariz yazım hatası kaçırdığımı veya mantığımı bir yerde yanlış anladığımı düşünüyorum.
Herhangi bir yardım her zaman takdir, teşekkür ederim.
Veritabanınızda dize olarak kaydedilmiş şifreler nelerdir? – RST
evet, php.net tavsiyelerine göre varchar (255) olarak saklanırlar – BottyZ
Kullanıcı artık hiç oturum açmadığında ne olur? Daha sonra veritabanı çalındığında savunmasız olurdu, çünkü şifresi hala bir MD5 hashı olurdu. – st2erw2od