こんにちは!タクマです。
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:filter
、email: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でも情報発信をしていますので、よかったらフォローをお願いします(^^)