2016-04-08 21 views
0

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.

+0

Veritabanınızda dize olarak kaydedilmiş şifreler nelerdir? – RST

+0

evet, php.net tavsiyelerine göre varchar (255) olarak saklanırlar – BottyZ

+0

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

cevap

1

Olabildiğince kucaklama gibi, sorunumun çözümünü buldum. Sorguya aktardığım e-posta değişkeni boştu. Kodumda daha önce farklı bir şekilde adlandırmıştım! Yine de neden bir sorgu e-postası alamadım ya da herhangi bir yerden giriş yapamıyorum hala emin değilim ... yukarıdaki @RyanVincent ile yaptığım yorumu görün.

Kodu gözden geçirmek için zaman ayırdığınız için teşekkürler!