すべての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);
}
私には、これはうまくいくはずだと思います。しかし、何らかの理由で、フォームにあるいくつかのチェックボックスから配列が返されません。彼らは空白で出続けます。
上記の関数を使用せずにコードをテストしましたが、正常に機能します。セキュリティを少し追加したいだけです。
ありがとう!
あなたがしていることは十分ではありません。 ここ を参照してください。
使用 filter_input 可能であれば(php5 +)それはそれをずっときれいに保ち、あなたがそれを使って必要とするかもしれないすべてを消毒して検証することができることを知らない限り。
filter var array を使用できます。たとえば、 FILTER_SANITIZE_STRING フラグを使用して、投稿配列全体をフィルタリングできます。
filter_var_array($_POST, FILTER_SANITIZE_STRING) //just an example filter
W3schoolsで利用できるさまざまなフィルターオプションがたくさんあります フィルターリファレンス
再帰をよりエレガントにするには、次のようなものを使用できます array_map 例:
$_POST = array_map('mysql_real_escape_string',$_POST);
これらの種類のアプローチは一般的に悪いので、可能であればfilter varを使用しますが、ほんの一例です;)
チェックされていないチェックボックスはサーバーに送信されません。
array_walk_recursive を使用して、やりたいことを実行できます
これは、入力をクリーニングするための間違った方法です。
_$_POST
_と_$_GET
_のすべてに、ブランケットmysqlエスケープを適用すると、データベースクエリを実行した後もデータを使用したいが、必要がない場合は、戻ってきて噛み付きます。そこにあるエスケープ文字。
MysqliまたはPDOでパラメーター化されたクエリを使用すると、mysql_real_escape_string()
を使用する必要がなくなります。