2016-04-08 5 views
0

データベースで更新されていないパスワードハッシュに関する問題が少しありました。誰かがそれを助けることができればそれは非常に高く評価されるだろうパスワードハッシュが更新されないのはなぜですか?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文まで実行されているようです。

私は明らかなタイプミスを覚えていないと思っています。あるいは、私のロジックがどこかに間違っていると思います。

ご協力いただきありがとうございます、ありがとうございます。

+0

はパスワードがデータベースに文字列として保存されていますか? – RST

+0

ええ、それらはphp.netの推奨に従ってvarchar(255)として保存されています – BottyZ

+0

ユーザーがもうログインしないとどうなりますか?その後、パスワードがMD5ハッシュであるため、データベースが盗まれたときに脆弱になります。 – st2erw2od

答えて

1

恥ずかしがり屋のように、私は私の問題を解決しました。私がクエリに渡していた電子メール変数は空でした。私は以前と違ってコードに名前を付けました! なぜ、私はまだどこかにクエリーエラーの電子メールまたはログを取得していませんでしたが、まだわかりません...上記の@RyanVincentに関するコメントを参照してください。

コードを見ていただきありがとうございます。

関連する問題