Laravel 9はbcryptでハッシュされた有効なパスワードを拒否します
P粉270842688
P粉270842688 2024-03-28 17:22:24
0
1
525

私は、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粉270842688
P粉270842688

全員に返信(1)
P粉464082061

あなたが提供したハッシュが「testperson」ハッシュであるというあなたの主張は、実際には間違っていると思います。ハッシュは一方向であるため、表示されているハッシュがどこから来たのかを伝えることはできません。注: PHP 7.4 では動作しますが、passwd_hash() の Salt オプションが非推奨になっているため、PHP 8 以降では動作しないと思います。

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート