web-dev-qa-db-ja.com

$ _POST変数のクリーニング

すべてのPOSTおよびGET変数を単一の関数で効果的に簡単にクリーンアップする方法を考え出そうとしています。関数自体は次のとおりです。

//clean the user's input
function cleanInput($value, $link = '')
{
    //if the variable is an array, recurse into it
    if(is_array($value))
    {
        //for each element in the array...
        foreach($value as $key => $val)
        {
            //...clean the content of each variable in the array
            $value[$key] = cleanInput($val);
        }

        //return clean array
        return $value;
    }
    else
    {
        return mysql_real_escape_string(strip_tags(trim($value)), $link);
    }
}

そして、これを呼び出すコードは次のとおりです。

//This stops SQL Injection in POST vars
foreach ($_POST as $key => $value)
{
    $_POST[$key] = cleanInput($value, $link);
}

//This stops SQL Injection in GET vars
foreach ($_GET as $key => $value)
{
    $_GET[$key] = cleanInput($value, $link);
}

私には、これはうまくいくはずだと思います。しかし、何らかの理由で、フォームにあるいくつかのチェックボックスから配列が返されません。彼らは空白で出続けます。

上記の関数を使用せずにコードをテストしましたが、正常に機能します。セキュリティを少し追加したいだけです。

ありがとう!

13
tscully

あなたがしていることは十分ではありません。 ここ を参照してください。

7
ryeguy

使用 filter_input 可能であれば(php5 +)それはそれをずっときれいに保ち、あなたがそれを使って必要とするかもしれないすべてを消毒して検証することができることを知らない限り。

filter var array を使用できます。たとえば、 FILTER_SANITIZE_STRING フラグを使用して、投稿配列全体をフィルタリングできます。

filter_var_array($_POST, FILTER_SANITIZE_STRING) //just an example filter

W3schoolsで利用できるさまざまなフィルターオプションがたくさんあります フィルターリファレンス

22
Andrew

再帰をよりエレガントにするには、次のようなものを使用できます array_map 例:

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

これらの種類のアプローチは一般的に悪いので、可能であればfilter varを使用しますが、ほんの一例です;)

7
robjmills

チェックされていないチェックボックスはサーバーに送信されません。

array_walk_recursive を使用して、やりたいことを実行できます

2
w35l3y

これは、入力をクリーニングするための間違った方法です。

_$_POST_と_$_GET_のすべてに、ブランケットmysqlエスケープを適用すると、データベースクエリを実行した後もデータを使用したいが、必要がない場合は、戻ってきて噛み付きます。そこにあるエスケープ文字。

MysqliまたはPDOでパラメーター化されたクエリを使用すると、mysql_real_escape_string()を使用する必要がなくなります。

2
Ben James