Laravel でパスワードリセットメールのバリデーションエラーメッセージを表示しないようにする



Laravel 6.x で laravel/ui の認証機能を導入すると、ユーザー登録やパスワード再設定の機能が自動でついてきますよね。便利なのでそのまま使っているというケースもあると思います。

Laravel の公式でも、この機能のエラーメッセージ等の日本語訳の言語ファイルも用意されています。

問題点

しかし、パスワードリセット時におけるエラーメッセージはセキュリティ上よくありません。

「メールアドレスに一致するユーザーは存在しません。」のバリデーションエラーが出てしまう。

存在しないメールアドレスを入力してパスワードを再設定しようとすると、「メールアドレスに一致するユーザーは存在しません。」といったエラーメッセージが表示されます。

一見親切なようですが、ここに問題があります。特定のメールアドレスについて登録されているかされていないかを、第三者が知ることができてしまいます。

第三者に知られないようにするには、メールアドレスがデータベースに存在しているかどうかを正直に表示してはいけないのです。

対策

メールアドレスの形式のバリデーションを通過したときは、データベース登録の有無にかかわらず、「パスワードリセットのメールを送信しました。」と正常系のメッセージを表示する必要があります。もちろんそのメールアドレスがデータベースに存在する場合はメールを送信し、存在しない場合は実際にはメールは送りません。

Laravel では、パスワード再設定のコントローラーである App\Http\Controllers\Auth\ForgotPasswordControllerSendsPasswordResetEmails トレイトで定義されている sendResetLinkFailedResponse メソッドを上書きしてやります。

これで、パスワード再設定のときに、エラーメッセージは表示されなくなります。

翻訳のカスタマイズ

あわせて resources/lang/ja/passwords.php を変更して、親切なメッセージにカスタマイズしておきます。

パスワードリセットメールを送信しました。30分経ってもメールが届かない場合は、入力されたメールアドレスが間違っているか、迷惑メールフォルダに入っている可能性がありますので確認してください。

メールアドレスを打ち間違えたなど、メールが届かない場合のフォローにもなります。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です