私は、Laravel 9 でのいくつかのパスワード検証エラーのトラブルシューティングに数日を費やしました。パスワード testperson
はハッシュ $2y$10$5xc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW
に解決されます。対応するデータベース テーブルを直接クエリすると、これが正しいハッシュ値であることが確認されます。ただし、Laravel の認証インフラストラクチャはこのパスワードを拒否し、認証を拒否します。
これは一般的ではありません。正しく解析できるパスワードが複数あります。たとえば、パスワード eo
は $2y$10$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2
に解決され、Laravel はパスワードを検証します。同じメカニズムで両方のユーザー レコードが作成されますが、権限は異なります (レコードのブール値で示されます)。
関数 password_verify
にバグが見つかりました。このスタック オーバーフローの質問とツリーハウス スレッドで偽陰性を返すことが判明しました。
具体的には、これはこの障害ポイントが発生する Laravel のスタックです:
login
ルートは、コントローラー クラスを介して \Illuminate\Foundation\Auth\AuthenticatesUsers::login
を呼び出します。 login
メソッドは \Illuminate\Foundation\Auth\AuthenticatesUsers::attemptLogin
を呼び出します。 attemptLogin
メソッドは、コントローラー ガード オブジェクトの attempt
メソッドを呼び出します。 \Illuminate\Auth\SessionGuard::attempt
\Illuminate\Auth\SessionGuard::hasValidCredentials
を呼び出します。 \Illuminate\Auth\SessionGuard::hasValidCredentials
ガード プロバイダー オブジェクトの validateCredentials
メソッドを呼び出します。 Illuminate\Auth\EloquentUserProvider::validateCredentials
そのハッシュ オブジェクトで check
メソッドを呼び出します。 Illuminate\Hashing\HashManager::check
ドライバーで check
メソッドを呼び出します。 Illuminate\Hashing\BcryptHasher::check
Illuminate\Hashing\AbstractHasher::check
を呼び出します。 Illuminate\Hashing\AbstractHasher::check
password_verify
を呼び出します。 スタック全体を巻き戻した後、ログイン コントローラーの login
メソッドで次のコードを実行します。
リーリー
リーリー
そのパスワードをSELECT users WHERE password= クエリに入力すると、期待したユーザーが得られます。
P粉4640820612024-03-29 11:37:34
あなたが提供したハッシュが「testperson」ハッシュであるというあなたの主張は、実際には間違っていると思います。ハッシュは一方向であるため、表示されているハッシュがどこから来たのかを伝えることはできません。注: PHP 7.4 では動作しますが、passwd_hash() の Salt オプションが非推奨になっているため、PHP 8 以降では動作しないと思います。
リーリー