九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、Laravel
は短い期間でアップデートされているわけですが、たまに大きな機能拡張の追加があったりもするので、マイナーアップデートであっても見逃さないようにしています。
そして、先日バージョン5.8.33
へのアップデートではメールアドレスの新しいバリデーションが追加になりました。
これはずっと前から言われていることなのですが、メールアドレスは一定の法則があるようで、実は正規表現で「有効 or 無効」をチェックするのは難しかったりします。(確か完璧には不可能だった気がします😫)
しかし、今回のアップデートでは、egulias/email-validatorというパッケージを使って様々な角度から「メールアドレスの妥当性チェック」ができるようになりましたので、早速それらを試してみることにしました!
ぜひ皆さんの参考になると嬉しいです😊✨
開発環境: Laravel 5.8.33
目次
前提として
今回追加されたメールアドレス用バリデーションでは、いくつかPHPの拡張機能が必要になるものがあります。
もし、以下のようなエラーが表示されたら以降の手順で拡張機能をインストールしてから実行してみてください。(実行環境は、Ubuntu 18.04
+ PHP 7.2
です)
まず、自分の環境にあうパッケージを検索します。
sudo apt search intl | grep "php"
結果は以下のようなものになります。
後は、ご自身のPHPバージョンに合うphp****-intl
というパッケージを選んで以下のようにインストールしましょう。
sudo apt install php7.2-intl
インストールが完了したら、ウェブサーバー(nginx
の場合はphp-fpm
)を再起動してください。
sudo systemctl restart php7.2-fpm
phpinfo()
で確認して以下のような項目が表示されていれば成功です。
新しいメールアドレス・バリデーション
email:rfc
RFC
と呼ばれるインターネットの標準仕様に合っているかをチェックするバリデーションです。(パッケージの説明では、RFC 5321
, 5322
, 6530
, 6531
, 6532
が対象となっています)
実際の例は以下になります。
$data = ['email' => 'te@st@example.com']; $validator = \Validator::make($data, [ 'email' => 'email:rfc' ]); if($validator->fails()) { // 有効なメールアドレスではない場合 // この例はエラーになります。 }
email:strict
先ほどの、email:rfc
をより厳格にしてもので「エラーだけでなく、警告があってもダメ」なバリデーションになっています。
例えば、以下のようにRFC
の形式としては正しいけれども、あまりにも長過ぎるメールアドレスもチェックするバリデーションになっています。
$email = str_repeat('x', 254).'@example.com'; // xが254個で長すぎる
実際の例はこうなります。
$data = ['email' => str_repeat('x', 254).'@example.com']; $validator = \Validator::make($data, [ 'email' => 'email:strict' ]); if($validator->fails()) { // 有効なメールアドレスではない場合 // この例はエラーになります。 }
email:dns
DNS
にそのメールアドレスのドメインが存在するかをチェックするバリデーションです。例えば、example.com
というドメインは存在していますがtest.example.com
というものは存在していません。
つまり、以下の例ではエラーと判断されてしまいます。
$data = ['email' => 'xxx@test.example.com']; $validator = \Validator::make($data, [ 'email' => 'email:dns' ]); if($validator->fails()) { // 有効なメールアドレスではない場合 // この例はエラーになります。 }
なお、ここで注意が必要なのは、このバリデーションは「ドメインが有効かどうか」をチェックするものなのでドメインさえ存在していれば有効であると判断するという部分です。
例えば、xxx.@example.com
というメールアドレスは@
の直前に.
があるのでemail:rfc
バリデーションではエラーになりますが、email:dns
のチェックでは通過してしまいます。
そのため、以下のように併用するのがいいでしょう。
$validator = \Validator::make($data, [ 'email' => 'email:rfc,dns' ]);
email:spoof
なりすましのメールアドレスは拒否するバリデーションです。
例えば、test@exаmple.com
というメールアドレスは見た目は妥当なように見えますが、実はこれは英語のexample
ではなく、а
に「キリル文字」が使われた偽装ドメインになっています。
このバリデーションではこうした偽装メールアドレスを文字コードの違いによって区別しています(内部では、Spoofchecker
を使っています)
$data = ['email' => 'test@exаmple.com']; $validator = \Validator::make($data, [ 'email' => 'email:spoof' ]); if($validator->fails()) { // 有効なメールアドレスではない場合 // この例はエラーになります。 }
※ メールスプーフィングについては、こちらのページのmasakielastic
さんの回答が詳しいです。
email:filter
PHP関数のfilter_var()を使ったメールアドレスのチェックです。
$data = ['email' => 'test.@example.com']; $validator = \Validator::make($data, [ 'email' => 'email:filter' ]); if($validator->fails()) { // 有効なメールアドレスではない場合 // この例はエラーになります。 }
ちなみに:バリデーションは併用できる
途中でも書きましたが、今回の新しいバリデーションは以下のように併用することができます。
$validator = \Validator::make($data, [ 'email' => 'email:strict,dns,spoof' ]);
おわりに
ということで、今回はLaravel
の新しいメールアドレス・バリデーションを紹介しました。
それにしても、以前どこかで聞いたことはあったもののメールスプーフィング(偽装アドレス)の仕組みには驚きました。キリル文字には以下のような英語にとても似ている文字が存在しているようで、悲しい話ですが、これらを駆使して有名企業などになりすまして悪さをする人がいるようです。
- а ・・・ 英語の「a」ではない
- р ・・・ 英語の「p」ではない
- К ・・・ 英語の「K」ではない
しかも似ている文字はキリル文字だけじゃないですしね・・・😅。
なにはともあれ、今回のアップデートでこういったものも事前に防ぐことができるようになりましたので、ぜひ皆さんも活用してみてはいかがでしょうか。
ではでは〜!