2

私は使っているfilter_var

メールが有効かどうかを確認する機能

function checkEmail($email)
{
    return filter_var($email, FILTER_VALIDATE_EMAIL);
}

これは私がする唯一のことです。たとえば、登録では、この関数を使用して電子メールを検証し、データベースに挿入します (ofc を使用する準備済みステートメント)。しかし、この関数でもサニタイズを使用することが不可欠ですか? 問題を引き起こす可能性のある「有効」だが「危険」な電子メールはありますか?

4

4 に答える 4

5

FILTER_VALIDATE_EMAIL電子メール アドレスが有効であることを確認します。文字列から「危険な」文字 (つまり、特定のコンテキストで特別な意味を持つ文字) を削除することとは何の関係もありません。

したがって、入力の検証はすべて適切であり、データがビジネス ルールに準拠していることを確認するために必要ですが、値を別のコンテキストに挿入するときに特殊文字をエスケープする必要がなくなるわけではありません。

したがって、HTML ページにドロップする文字列は引き続き使用する必要がhtmlspecialchars()あり、MySQL クエリのリテラルにドロップする文字列は引き続き使用する必要がありますmysql_real_escape_string()(または、mysqli または PDO のようにパラメーター化されたクエリを使用することをお勧めします)。文字列をクエリで停止する必要はありません)。どのような入力検証を行ったかに関係なく、コンテンツを構築するときは常に出力エスケープが発生する必要があります。

問題を引き起こす可能性のある「有効」だが「危険」な電子メールはありますか?

そうです。a&a@b.comHTML に挿入すると破損します。a%a@b.comURL コンポーネントに挿入されると破損します。a'a@b.comSQL 文字列リテラルに挿入されると破損します。コンテキスト依存の出力エスケープは不可欠です。あるコンテキストで問題になる可能性のあるすべての文字を削除しようとすると、実質的にすべての句読点を削除することになり、あまり良くありません。

于 2012-06-02T16:51:43.953 に答える
1

検証とサニテーションは 2 つの異なるアクションです。

ユーザー入力が必要な正しい形式であることを確認するために、検証が行われます。悪意のあるユーザーがデータベース/アプリケーションに損害を与えるのを防ぐために、サニテーションが行われます。

通常、両方のアクションが必要です。

MySQLi または PDO を使用して準備済みステートメントを使用する場合は、サニテーションをスキップできます。

于 2012-06-02T16:47:50.780 に答える
0

電子メールアドレスに改行が含まれていると、検証にも合格し、問題が発生する可能性があるため、安全のために検証する前にサニタイズします (セキュリティ速報)。

return filter_var(
         filter_var(
           $email,
           FILTER_SANITIZE_EMAIL
         ),
         FILTER_VALIDATE_EMAIL);

trim()末尾の空白と改行を削除するために使用することもできます。

于 2012-06-02T16:45:38.443 に答える
0

ウィキペディアの電子メール アドレスに関するエントリによると、メール アドレス'にはやなどの特殊な文字がいくつか許可されてい%ます。したがって、サニタイズするか、準備済みステートメントを使用する必要があります。

于 2012-06-02T16:48:41.730 に答える