Laravelではデフォルトでvalidationルールにemailが存在します。
しかし、これには日本独特の落とし穴があるため、工夫が必要となります。
目次
Laravelのemailのvalidation
まず、Laravel側が用意しているvalidationルールは下記になります。
'email' => ['email:rfc,dns']
email
とつけることで簡単にルールが設定できます。
いくつかオプションが存在するので、そちらを整理しましょう
オプション | 利用されるValidationクラス | 詳細 |
rfc | RFCValidation.php | メールアドレスの形式があっているかのチェックする。 RFCと呼ばれるインターネットの標準仕様に合っているかをチェックするバリデーションです。(パッケージの説明では、RFC 5321, 5322, 6530, 6531, 6532が対象となっています) デフォルトで利用される。 |
strict | NoRFCWarningsValidation.php | 先ほどの、email:rfcをより厳格にしてもので「エラーだけでなく、警告があってもダメ」なバリデーションになっています。 |
dns | DNSCheckValidation.php | DNSにそのメールアドレスのドメインが存在するかをチェックするバリデーションです。例えば、example.comというドメインは存在していますがtest.example.comというものは存在していません。 |
spoof | SpoofCheckValidation.php | なりすましのメールアドレスは拒否するバリデーションです。 例えば、test@exаmple.comというメールアドレスは見た目は妥当なように見えますが、実はこれは英語のexampleではなく、аに「キリル文字」が使われた偽装ドメインになっています。 |
filter | FilterEmailValidation.php | PHP関数の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での登録となりすましメールを拒否は必須なので、spoof
とdns
は必須です。
また、より厳格なメールアドレスルールを適用させたいため、strict
を利用します。
'email' => ['email:strict,dns,filter,spoof', new Hankaku(), 'max:255', 'unique:users']
開発や要望によって、厳格さを下げるのであれば、下記で最低限を抑えられています。
'email' => ['email:dns,filter', new Hankaku(), 'max:255', 'unique:users']
コメント