初めに
Laravelではデフォルトで様々なバリデーションルールを準備してくれており、生PHPと比べてかなり簡単にバリデーションを設定することができます。
しかし、デフォルトのものには実は注意が必要と言う事をお話しして行きます。
その中で、今回は 『email』のバリデーションルールについて紹介します。
問題点
デフォルトでは、emailの形式ユーザー名(メールアカウント)@ドメイン名
でなければバリデーションエラーを出力してくれます。
return Validator::make(
$data,
[
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:3', 'confirmed']
]
しかし....
以下のような形式だとバリデーションエラーとはならず登録処理が実行されてしまいます。
これではドメインが存在しないアドレスが気軽に登録されてしまう。
それどころか、この状態でサービスをもしリリースしたらとんでもないことになる...
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つを適用します。
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のコードを閲覧してきましたが、意外にもこのルールについて知らない人多いんではないでしょうか?
今回の内容だけでなく、便利なメソッドだからといって使うと思わぬ落とし穴があるものは他にもありそうです、、