web-dev-qa-db-ja.com

PHPで$ _POST配列全体をサニタイズする良い方法は何ですか?

filter_var($_POST['var'], FILTER_SANITIZE_STRING);で各$_POST値をサニタイズするのではなく、多くの変数を含むフォームを使用してメールを送信しています。デフォルトのアクションはFILTER_SANITIZE_STRINGであると信じているのでうまくいくようですが、私は人々の意見が何であるのか疑問に思っていました。 $_POST値は個別に新しい変数に埋め込まれるため、開始時にarray_mapのみを使用してすべてをサニタイズします...

$_POST = array_map('filter_var', $_POST);

基本的に次の情報を提供するために、ご返信いただきありがとうございます。

キャプチャされているフォームに20〜30個の入力フィールドがあり、入力を確認するためにデータがユーザーに表示され、変数がサニタイズされ、ユーザーに電子メールが送信され、最後に詳細がdbに入力されます。

現在、上記のarray_map関数と、メールを送信する前のメールアドレスのFILTER_SANITIZE_EMAILを使用してサニタイズしており、dbへの挿入の前にmysql_real_escape_string()を使用して入力をエスケープしています。準備されたステートメントなどに入ることなく。あなたは私がさらに何かをすべきだと思いますか?再度、感謝します!

32
SirG

各入力変数の型が文字列であり、それらを一度にすべてサニタイズする場合、次を使用できます。

// prevent XSS
$_GET   = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

これにより、$ _ GETおよび$ _POST配列がサニタイズされます。

ここに表示されます: PHP-配列の値をサニタイズ

73
johnny.rodgers

使用目的に依存します。

データベースに挿入する場合、引用符付き文字列の場合は mysql_real_escape_string() を、数字の場合は型キャストを使用します-理想的に準備されたステートメントですが、それはまったく別の問題です。

データをWebページに出力する予定がある場合は、 htmlspecialchars() のようなものをお勧めします

ユーザー入力をシェル引数として使用する予定がある場合は、 escapeshellarg() を使用します。

メールの送信に関する質問に移ります。さて、次のもので十分です:

filter_var($_POST['message'], FILTER_SANITIZE_STRING);

これは基本的にタグを取り除き、特殊文字をエンコードするだけです。

19
Russell Dias

全面的な衛生を行う正しい方法はありません。必要な衛生管理方法は、データに対して何が行われるかによって異なります。

データを使用する前に直接サニタイズします。

5
Pekka 웃

これは私のすべてのプロジェクトで使用するものです:

function util_array_trim(array &$array, $filter = false)
{
    array_walk_recursive($array, function (&$value) use ($filter) {
        $value = trim($value);
        if ($filter) {
            $value = filter_var($value, FILTER_SANITIZE_STRING);
        }
    });

    return $array;
}

ポストされたデータのネストされた配列をトリムおよびサニタイズできます

2
ymakux

複数のフィールドに特定のフィルターを適用するには、switchステートメントを使用します。

$post  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

foreach($post as $k => $v) {
    switch ($k) {
        case 'int_1':
        case 'int_2':
            $post[$k] = filter_var($v, FILTER_SANITIZE_NUMBER_INT) * 1;
            break;
        case 'float_1':
        case 'float_2':
            $post[$k] = filter_var($v, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION) * 1;
            break;
        default:
            break;
    }
}

注:My IDE(NetBeans)は、グローバル$_POSTをセキュリティ違反として使用することについて警告するため、ローカル$post変数を使用する習慣になりました。代わりに、ブランケット文字列のサニテーションを最初に行わないことを選択した場合、FILTER_SANITIZE_STRINGdefault:の場合に使用できます。

0
OXiGEN