GET パラメータで電子メール アドレスを受け入れたいページがあります。を使用した場合FILTER_VALIDATE_EMAIL
でも、xss や JavaScript インジェクション攻撃などに対して脆弱ですか?
私は、それが良い、または十分な電子メール アドレスのバリデーターであるかどうかを尋ねているわけではありません。渡された任意の文字列を介して不正な Web コードを挿入できるかどうかを知りたいのですが、それを防ぐために追加のフィルタリングを行う必要がありますか?
はい、有効な電子メール アドレスは、攻撃に使用できる慎重に作成された文字列のコンテナとして簡単に使用できます。
「フィルタリング」の考え方から抜け出し、「エスケープ」の考え方に入ります。普遍的な「安全にする」フィルターは存在しません。すべてのエスケープはコンテキスト固有の方法で行う必要があるため、存在できません。
たとえば、電子メール アドレスがプレーン テキスト ドキュメントに出力される場合は、何もする必要はありません。HTML ドキュメントにテキスト ノードとして出力される場合は、HTML コンテキスト用にエスケープする必要があるため、HTML の特殊文字とエンティティをエスケープします。それが html ドキュメントに入れられ、その値が html 属性内にある場合、非常に慎重にエスケープを実行する必要があり、それはどのhtml 属性に依存します。SQLクエリで使用されている場合は、データベース固有のエスケープ関数を介してエスケープする必要があります。それでも、パラメーター値(つまり、where someColumn = '$paramVal'
)として使用している場合と、テーブル名、列名 (つまり、order by $myEscapedColumnName DESC
)。等々。
文字列の内容ではなく、使用のコンテキストがすべてです。これはすべて (電子メールやその他のユーザー入力だけでなく) に当てはまり、セキュリティの問題だけでなく、プログラミングと構文の正確さの問題でもあります。適切なエスケープは複雑で、学ぶのに多くの時間がかかり、コーディングするときは慎重に検討する必要があります。多くのコーダーは努力のためにそれを気にせず、彼らは会社がハッキングされる原因となっています.
参考までに、電子メールアドレスの仕様では引用符で囲まれた文字列が許可されているため、"<script>alert('xss')</script>"@example.com
. 可能性は明らかです。
これで十分なはずですが、データベースなどに入力するときはもちろんエスケープする必要があります。PHP や Apache などにどのような種類のバグが存在し、攻撃が発生する可能性があるかはわかりません。