Laravel

Laravel 最強のemail バリデーションを伝授します【email:filter / email:dnsも解説】

タクマ

こんにちは!タクマです。

31歳未経験からエンジニア転職に成功し、

2021年3月より都内の受託開発企業にてサーバーサイドエンジニアとして働いており、

PHP/Laravelを使用し開発をしています。

今回はLaravelで、僕が考える最強のemailバリデーションを読者の皆さんに伝授します。

最強のemailバリデーションを設定すれば、不正な入力を防ぐことができ、セキュリティ的に安全になります。

また認知度も高くない(と思う)ので、これを知ることでドヤることができます。笑

なので、Laravelエンジニアの方は絶対に最後まで読んでください!

バリデーションルール email は不十分

下記のようなemailバリデーションルールはバリデーションとしては不十分です。

public function rules()
{
    return [
        'email' => 'required|email'
    ];
}

なぜかというと下記のような入力ができてしまうからです。

あいうえお@gmailcom  // 平仮名、ドットなし
アイウエオ@手紙ドットコム  // カタカナ、漢字、ドットなし

つまりデフォルトのemailというバリーデーションルールは@の前後に何らかの文字列があればバリデーションが通ってしまいます。

(ただし、@の直前、直後にドットがある場合はバリデーションで弾きます。)

これでは、アプリケーションのセキュリティ的にもよろしくないですね。

解決策

では解決するためにはどういったバリデーション設定すべきか?

結論として、下記のように設定すればOKです!

そして下記が僕が考える最強のemailバリデーションになります!

public function rules()
{
    return [
        'email' => 'required|email:filter,dns'
    ];
}

では一つずつ解説します。

email:filter

email:filterバリデーションを設定することで、平仮名、カタカナ、漢字は登録できなくなります。

さらに@の後にドットが最低一つなければバリデーションで弾くようになります。

なので下記のような入力はemail:filterバリデーションで弾きます。

// 登録できない入力例

あいうえお@gmailcom  // 平仮名、ドットなし
アイウエオ@手紙ドットコム  // カタカナ、漢字、ドットなし
aiueo@testjp // ドットなし

逆に下記のような入力は通ります。

// 登録できる入力例

aiueo@test.jp
yamada19@yyy.jy
test@hardbank.ne.jp
yanagita@example.com

email:filterにするだけでバリデーションがかなり強力になりますね。

email:dns

email:dnsは、メールアドレスのドメインが存在するかをチェックするバリデーションです。

ドメインとは@以降の文字列のことです。

例えば、

gmail.com
softbank.ne.jp
yahoo.co.jp

などがドメインです。

email:dnsはドメインが存在していなかったらバリデーションで弾きます。

なので下記のような入力はドメインが存在しないためemail:dnsバリデーションで弾きます。

// 登録できない入力例

test@hardbank.ne.jp
yamada19@yyy.jy
tanaka@codomo.jp
takahashi@gmail.moc
yanagita@example.com

逆に下記のような入力は通ります。


// 登録できる入力例

テスト@softbank.ne.jp
たなか@docomo.ne.jp
高橋@gmail.com
sato.@yahoo.co.jp

email:dnsバリデーションは、ドメインが存在さえしているば、平仮名、カタカナ、漢字などで登録できてしまいます。

また、@の前にドットも登録できてしまいます。

結論、email:filterとemail:dnsの組み合わせが最強

なので先に説明した通り

public function rules()
{
    return [
        'email' => 'email:filter,dns'
    ];
}

email:filterとemail:dnsの組み合わせが最強です!!

組み合わせる際は上記のように , 区切りで記述します。(記述する順番は関係ありません。)

このバリデーションを設定することで、下記のようなバリデーションルールになります。

  • 存在するドメイン以外は登録できない
  • 平仮名、カタカナ、漢字は登録できない
  • @の直前・直後に . がある場合は登録できない
  • その他emailの形式に沿わない入力は登録できない(例:先頭・末尾が記号の場合、記号が連続している場合、特殊記号の場合など)

これで不正な値は入力できなくなり、かなり強力で十分なバリデーションとなりますね。

これが、正規表現を使わずに設定するバリデーションとしては最強です!

なので、email:filteremail:dns単体で通っていた下記のような入力もバリデーションで弾くことができます。

// 登録できない入力例

// 存在しないドメイン名のため
aiueo@test.jp
yamada19@yyy.jy
test@hardbank.ne.jp
yanagita@example.com

// 平仮名、カタカナ、漢字、@の直前に . があるため
テスト@softbank.ne.jp
たなか@docomo.ne.jp
高橋@gmail.com
sato.@yahoo.co.jp 

以上のことから、メールアドレスのバリデーションはemail:filter,dnsを設定することをオススメします!

さいごに

いかがでしたでしょうか。

メールアドレスのバリデーションについて理解できましたでしょうか?

ご質問やご指摘等ある方はコメントしていただければ返信させていただきます。

これからもLaravelエンジニアの方、Laravel学習中の初学者の方に役に立つ記事を更新していきますのでよろしくお願いします!

Twitterでも情報発信をしていますので、よかったらフォローをお願いします(^^)

Webエンジニア
タクマ
埼玉県出身の33歳

新卒で入社した専門商社で8年間営業職として勤務

30歳からプログラミングを始め31歳でWebエンジニアに転職成功

受託開発企業での開発を1年弱経験したのち、現在はスタートアップの自社開発企業で開発に従事している
\ Follow me /

COMMENT

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

CAPTCHA