2009-10-22 22 views
11

私は、効果的にすべての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); 
} 

私にはこれがそうです。しかし、何らかの理由で、フォームにあるチェックボックスから配列を返さないでしょう。彼らは空白を続けています。

私は上記の機能を使わずにコードをテストしたところ、うまくいきました。そこにセキュリティを追加したいだけです。

ありがとうございます!

+1

すべてのコンテキストですべてをサニタイズしないでください。アプリケーションを邪魔するだけで、失われた機能を再現したいときにはセキュリティを確保することが難しくなります。これは、magic_quotesが無効になった正当な理由です。 http://php.net/manual/en/security.magicquotes.phpあなたがここで再現しているもの。送信するアプリケーションの入力をサニタイズする必要があります。 HTTP経由でブラウザに送信する場合は、HTTPとHTMLのためにそれをサニタイズします。 SQL DBに送信する場合は、SQL用にサニタイズします。 – bucabay

+0

申し訳ありませんが、私は非推奨です:http://php.net/manual/en/security.magicquotes.php – bucabay

+0

ヘルプ/アドバイスありがとうございました!私のプロセスを再考する必要があるように見えます。 :-) – tscully

答えて

6

が十分ではありませんやりたいarray_walk_recursiveを使用することができます。 hereを参照してください。あなたが例えばarray_mapのようなものを使用することができます再帰は、よりエレガントにする

22

可能であればfilter_inputを使用してください(php5 +)それは多くのクリーナーを保持し、あなたがそれを使用する必要がある可能性があるすべてを浄化し、検証することができます。

あなたは、全体のpost配列をフィルタリングするfilter var array例えばFILTER_SANITIZE_STRINGフラグを使用することができます

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

filter reference

+0

ああこれは素晴らしいです!私はこれまでにこれを見たことがない:) – Mickey

+1

php5を持っている場合、これが最良の方法 – robjmills

1

未チェックのチェックボックスがサーバーに送信されないW3Schoolsの上で利用できるさまざまなフィルタオプションの負荷があります。 。

あなたは何をやっている

6

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

用フィルターVARをあなたががアプローチのこれらの種類としてしかし、あくまで一例一般的に悪いことができるかどうか;)

1

これは、入力の消去について間違った方法です。

あなたはまだあなたがデータベースクエリを作った後にデータを使用したい場合は、戻って来て、あなたを噛まないように起こっている $_POST$_GETで絶対にすべてのものに逃げるブランケットMySQLを適用

いますが、中にエスケープ文字を望んでいませんそこ。

mysqliまたはPDOでパラメータ化されたクエリを使用すると、mysql_real_escape_string()を使用する必要はありません。

+0

データベースに接続していないとさらに悪化する。 – alex

+0

私は、関数呼び出しのすぐ上に接続を設定しましたが、あなたは私がそこにいるものを見る必要はありません。 ;-) – tscully

+0

参照:http://php.net/manual/en/security.magicquotes.php – bucabay

関連する問題