0

データベースでパスワード ハッシュが更新されないという問題が少しあり、何が間違っていたのかを確認するのに苦労しています。誰かがそれを助けることができれば、それは大歓迎です。

基本的に、私は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 ステートメントまで実行されているようです。

明らかなタイプミスを見逃したか、どこかでロジックが間違っているとしか思えません。

いつも助けていただきありがとうございます。

4

1 に答える 1

1

恥ずかしいかもしれませんが、問題の解決策を見つけました。クエリに渡していた電子メール変数が空でした。以前のコードで別の名前を付けていました。ただし、クエリエラーのメールやログがどこにも届かなかった理由はまだわかりません...上記の@RyanVincentのコメントを参照してください。

コードを確認するために時間を割いていただき、ありがとうございます。

于 2016-04-11T12:02:55.727 に答える