初めに
Laravelではデフォルトで様々なバリデーションルールを準備してくれており、生PHPと比べてかなり簡単にバリデーションを設定することができます。
しかし、デフォルトのものには実は注意が必要と言う事をお話しして行きます。
その中で、今回は 『email』のバリデーションルールについて紹介します。
問題点
デフォルトでは、emailの形式ユーザー名(メールアカウント)@ドメイン名でなければバリデーションエラーを出力してくれます。
App\Http\Controllers\Auth\RegisterController.php
return Validator::make(
$data,
[
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:3', 'confirmed']
]
しかし....
以下のような形式だとバリデーションエラーとはならず登録処理が実行されてしまいます。
test@example.com
test@gmail.comああ
これではドメインが存在しないアドレスが気軽に登録されてしまう。
それどころか、この状態でサービスをもしリリースしたらとんでもないことになる...
emailのバリデーションの種類
公式ドキュメントによると、5種類あります。
rfc: RFCValidation
strict: NoRFCWarningsValidation
dns: DNSCheckValidation
spoof: SpoofCheckValidation
filter: FilterEmailValidation
詳細
バリデーションスタイル
内容
rfc
RFCと呼ばれるインターネットの標準仕様に合っているかをチェックするバリデーション
strict
email:rfcをより厳格にしてもので「エラーだけでなく、警告があってもダメ」なバリデーション
dns
DNSにそのメールアドレスのドメインが存在するかをチェックするバリデーション
spoof
なりすましのメールアドレスは拒否するバリデーション
filter
PHP関数のfilter_var()を使ったメールアドレスのチェック
バリデーションの書き方
問題となるメールアドレスを通さないだけであれば、dnsのみの設定でも対応はできますが、その他の対策ができていないため併用して書きます。
以下は、strict(RFCに違反するアドレスがはじかれる)、dns(ドメインが有効でないアドレスがはじかれる)、spoof(なりすましメールもはじかれる)の3つを適用します。
App\Http\Controllers\Auth\RegisterController.php
return Validator::make(
$data,
[
'name' => ['required', 'string', 'max:255'],
//emailに新しいバリデーションを追加
'email' => ['required', 'string', 'email:strict,dns,spoof', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:3', 'confirmed']
]
これでemailのバリデーション対策ができます。
最後に
Laravelの『email』のバリデーションルールに注意が必要というお話をしてきました!
Laravelを触り始めて、色んな人のGitHubのコードを閲覧してきましたが、意外にもこのルールについて知らない人多いんではないでしょうか?
今回の内容だけでなく、便利なメソッドだからといって使うと思わぬ落とし穴があるものは他にもありそうです、、
↧