はじめに
最近、Laravelを使用した案件でメールアドレスでユーザー登録をしてもらう際に、バリデーションを掛けているにも拘らず不正なメールアドレスが登録される不具合がありました。
バリデーションルール設定不足が原因だったのですが、メールアドレスのバリデーション設定について調べる良い機会になったので、紹介したいと思います。
不具合内容
バリデーションルール設定
FormRequestクラスを継承して以下の様にルール設定していました。
email
と設定したら、後はLaravel側でいい感じにバリデーションしてくれていると思っていました。
1 2 3 4 5 6 | public function rules() { return [ 'email' => 'required|email|max:255|', ]; } |
不正なメールアドレス例
実際には以下の様なメールアドレスがバリデーションを通ってしまいました。
・〜@gmailcom(ドット抜け)
・〜@gmail(.com抜け)
・〜 @gmail.com(半角スペース)
・〜.@gmail.com(@マーク前にドット)
対応
結論から言うと、追加設定で対応する事が出来ました。Laravel5.8以降で使用可能となっています。
設定は以下5種類があります。
email:rfc
RFC準拠になっているかチェックする。RFC 5321, 5322, 6530, 6531, 6532が対象とのことです。
email:strict
上記の
email:rfc
のバリデーション時により厳格にチェックする。
Warningも出した時点でバリデーションエラーとするようです。
email:dns
メールアドレスのドメインが有効かどうかをチェックする。
内部では、dns_get_recordメソッドで
DNS_MX
、
DNS_A
、
DNS_AAAA
のレコードからドメインチェックしているようです。
email:spoof
偽装文字コードが使用されていないかチェックする。偽装メールアドレス防止などに有効の様です。
内部では、Spoofcheckerクラスを使用してチェックしているようです。
email:filter
RFC準拠になっているかチェックする。
内部でfilter_var()メソッドを使用してチェックしているようです。
修正
ルール検証
以下のコードで検証した所、
strict
又は
dns
のどちらかでバリデーションに成功しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | private const RULES = [ 'email:strict', 'email:dns', ]; private const INVALID_EMAILS = [ 'test@gmailcom', // ドット抜け 'test@gmail', // .com抜け 'test @gmail.com', // @前に半角スペースあり 'test.@gmail.com', // @前にドットあり ]; public function get() { foreach (static::INVALID_EMAILS as $email) { foreach (static::RULES as $rule) { if (Validator::make(['email' => $email], ['email' => $rule])->fails()) { dump('バリデーションエラー'); } else { dump('バリデーション通過'); } } } } |
修正後バリデーションルール設定
という事で、修正後のバリデーションルールは以下となりました。
今回は、
strict
と
dns
を設定する事で無事に不正メールアドレスをはじく事が出来ました。
1 2 3 4 5 6 | public function rules() { return [ 'email' => 'required|email:strict,dns|max:255|', // stricとdnsを付けて不正メールアドレスをはじく ]; } |
さいごに
メールアドレスバリデーションが簡単に実装出来て非常に便利ですね。