2017-10-20 11 views
0

デフォルトのLaravel検証クラスでは、奇妙な電子メールが許可されます。 aaaa?#%&'@şğüçi̇ö.comは、それが検証に合格:Laravel電子メール検証の問題

return Validation::make($data, [ 
     'email' => 'required|string|email|max:100|unique:customers,email' 
]); 

私はいくつかの奇妙な電子メールなどを使用しようとしたとき:ここで私は定義された検証ルールです。しかし、電子メールの非ラテン文字はDB挿入の前に変換されます。したがって、データベースの電子メールアドレスは元のものと一致しません。

これを防ぐために、@記号の後に非ラテン文字を使用しないようにします。

public function passes($attribute, $value) 
{ 
    return filter_var($value, FILTER_VALIDATE_EMAIL) 
    && preg_match('/@.+\./', $value); 
} 

カスタムルールを試しましたが、動作していません。これについていくつかの助けを受けることは良いことです。

編集1 ありがとうございました!しかし、明らかにカスタムバリデーターがアクションを取らない理由は、Laravelが操作の前にすべての入力データを消毒するということです。そのため、非ラテン文字を変換した後では、入力に非ラテン文字がないため、preg_replace()は常に1を返します。まず第一に私はこれに対する解決策を見つけ出し、Laravelが入力を害さないようにする必要があります。あなたの質問から

+0

パスメソッドの 'return filter_var($ value、FILTER_VALIDATE_EMAIL);はどうでしょうか? – Maraboc

答えて

1

は、私が理解し、あなたがすでにカスタム検証ルールを作成し、あなたがhereを見ることができるように

... 
'email' => [ 
    'required', 
    'string', 
    ... 
    new ValidateLatinEmail() 
] 

のようにそれを使用し、あなたの正規表現は、その妥当性に問題がある

この1は動作するはずです:

public function passes($attribute, $value) 
{ 
    return filter_var($value, FILTER_VALIDATE_EMAIL) 
     && preg_match('/@[\x00-\x7F]*\./', $value); 
} 
関連する問題