I have a class that validates every input before I send it to the database layer. Note that my problem is not about escaping or anything. My database layer will handle the SQL Injection problem. All I want to do is validate if the email is valid or not because later that email might be used as a 'send to'. For instance, the user will recover access to his account through a link sent to the e-mail. I read a lot about filter_var
and there are a bunch of people being against it and other bunch being in favor. Keeping the focus on 'I just want to validate email and not filter it for database or for html or XSS or whatever', is there a problem in using filter_var
?
6 に答える
はい、そうすべきです。
自作の代わりに標準ライブラリ検証を使用すると、複数の利点があります。
- 多くの人は、あなたが使用するコード (少なくとも 2 つ) をすでに見ています。できれば、リリースにマージされる前であっても、電子メールの検証の経験があることを願っています。
- 単体テスト済みです。
- 他の人も同じチェックを使用してバグを報告し、PHP の更新時にこれらの修正を無料で入手できます。
ただし、電子メール アドレスの形式を確認することは防御の最前線にすぎません。それが本物かどうかを本当に知りたい場合は、そのアドレスにメッセージを送信する必要があります。
はい、使用する必要がfilter_var
あります。これを組み込む方法は次のとおりです。
if( filter_var( $email ,FILTER_VALIDATE_EMAIL ) )
{
/*
* Rest of your code
*/
}
残念ながら、filter_var
はアドレスのローカル部分 (@ の前) で UTF8 をサポートしていません。また、国際ドメイン名をサポートするには、ドメイン名を個別に実行する必要がありますidn_to_ascii
(これは面倒でわかりません)。
私の意見では、これはfilter_var
かなり役に立たない: Unicode のメールアドレスが世の中に出回れば増えるほど、正当なメールアドレスが失敗する可能性が高くなる. これは特に中国やブラジルのような国でこれらのアドレスに対する明らかな需要がある場合に当てはまる. filter_var
また、 のような電子メール アドレスは許可されませんroot@localhost
。これらは有効で、サーバー コンテキストで役立つ可能性があります。
特定の指示に従って検証する電子メール ライブラリが存在する場合、非常に便利です。ドメイン名のみが許可されているか、localhost などの任意のホストも許可されていますか、または有効なカスタム ドメインのホワイトリストがありますか? ユニコードを許可する必要がありますか? フリーメール ドメイン名 (@homail.com など) のよくあるタイプミスで失敗するものは何ですか?
また、一部のドメイン名をより具体的な方法で検証することも賢明です。hotmail.com では今のところ Unicode 文字を許可しておらず、使用できる文字に特定の制限があります。PHP アプリケーションで使用されるほとんどの電子メール アドレスは、おそらく 100 の異なるドメインに集中しているため、これを使用してこれらのドメイン名をより適切に検証できます。残念ながら、私の知る限り、そのようなライブラリはまだ存在しません。