【Laravel】メールのvalidationルールを設定する

Laravelではデフォルトでvalidationルールにemailが存在します。

しかし、これには日本独特の落とし穴があるため、工夫が必要となります。

目次

Laravelのemailのvalidation

まず、Laravel側が用意しているvalidationルールは下記になります。

'email' => ['email:rfc,dns']

emailとつけることで簡単にルールが設定できます。

いくつかオプションが存在するので、そちらを整理しましょう

オプション利用されるValidationクラス詳細
rfcRFCValidation.phpメールアドレスの形式があっているかのチェックする。
RFCと呼ばれるインターネットの標準仕様に合っているかをチェックするバリデーションです。(パッケージの説明では、RFC 5321, 5322, 6530, 6531, 6532が対象となっています)
デフォルトで利用される。
strictNoRFCWarningsValidation.php先ほどの、email:rfcをより厳格にしてもので「エラーだけでなく、警告があってもダメ」なバリデーションになっています。
dnsDNSCheckValidation.phpDNSにそのメールアドレスのドメインが存在するかをチェックするバリデーションです。例えば、example.comというドメインは存在していますがtest.example.comというものは存在していません。
spoofSpoofCheckValidation.phpなりすましのメールアドレスは拒否するバリデーションです。 例えば、test@exаmple.comというメールアドレスは見た目は妥当なように見えますが、実はこれは英語のexampleではなく、аに「キリル文字」が使われた偽装ドメインになっています。
filterFilterEmailValidation.phpPHP関数のfilter_var()を使ったメールアドレスのチェックです。
検証フィルタのFILTER_VALIDATE_EMAILを利用します。
値が妥当な e-mail アドレスであるかどうかを検証します。
この検証は、e-mail アドレスが » RFC 822 の addr-spec 形式 に沿ったものであるかどうかを確かめます。 ただし、コメント、空白の折り返し (whitespace folding) および ドットなしドメイン名 (dotless domain name) には対応していません。
平仮名、カタカナ、漢字は登録できなくなります。さらに@の後にドットが最低一つなければバリデーションで弾くようになります。

デフォルト設定の落とし穴

全角アルファベットが通過してしまいます。

たとえalphaを追加したとしても、全角のアルファベットは通過します。

Windowsだと気軽に全角アルファベットを入力できてしまうので、これを弾いてあげないと全角文字のメールアドレスがDBに保存されてしまいます。

メール送信に失敗すると、AWSのSESのバウンスレートに引っかかり、メール送信が一時停止される可能性が上がります。

なので、独自ルールを設定する必要があります。

半角ルールを設定作成する

php artisan make:rule Hankaku  

これでHankaku.phpが生成される。

この中に、半角数字のみのvalidationルールを設定する。

namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Hankaku implements Rule
{
  public function __construct()
  {
  }

  public function passes($attribute, $value)
  {
      return preg_match('/^[a-zA-Z0-9]+$/', $value);
  }

  public function message()
  {
    return ':attribute は半角英数字で入力してください';
  }
}

これで出来上がりです。

軽くそれぞれの説明を書いておきます。

文字説明
^行頭(ウィンドウ幅などで折り返した表示上の行頭は含まない)。
[a-zA-Z0-9]アルファベットの小文字・大文字と数字
+直前の文字が 1回以上 繰り返す場合にマッチします。
最長一致。条件に合う最長の部分に一致します。
$行末(ウィンドウ幅などで折り返した表示上の行末は含まない)。

このルールは他でも利用できるので、便利です。

それでは、このルールを追加しましょう

最適な設定

実在するDNSでの登録となりすましメールを拒否は必須なので、spoofdnsは必須です。
また、より厳格なメールアドレスルールを適用させたいため、strictを利用します。

'email' => ['email:strict,dns,filter,spoof', new Hankaku(), 'max:255', 'unique:users']

開発や要望によって、厳格さを下げるのであれば、下記で最低限を抑えられています。

'email' => ['email:dns,filter', new Hankaku(), 'max:255', 'unique:users']
ぎゅう
WEBエンジニア
渋谷でWEBエンジニアとして働く。
LaravelとVue.jsをよく取り扱い、誰でも仕様が伝わるコードを書くことを得意とする。
先輩だろうがプルリクにコメントをして、リファクタしまくる仕様伝わるコード書くマン
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる