mysql_real_escape_string()のための全体を$_REQUEST配列、または必要なループを通してですか?
-
26-09-2019 - |
質問
はありますので安全に抽出に提出した変数以外は次のうちどれでしょう?
if(isset($_REQUEST['kkld'])) $kkld=mysql_real_escape_string($_REQUEST['kkld']);
if(isset($_REQUEST['info'])) $info=mysql_real_escape_string($_REQUEST['info']);
if(isset($_REQUEST['freq'])) $freq=mysql_real_escape_string($_REQUEST['freq']);
(お:使い isset()
この文脈?)
解決
一度にすべての変数をエスケープします:
$escapedGet = array_map('mysql_real_escape_string', $_GET);
からの抽出物の現在の名前空間にすべての変数(すなわち$foo = $_GET['foo']
):
extract($escapedGet);
けれども、この最後のステップを行わないでください。 、ちょうど配列の値を残す必要はありません。抽出変数は、名前の衝突や手間やバグのソースだけでなく、セキュリティ上のリスクだけではない既存の変数の上書きにつながることができます。また、@BoltClockが言うように、$_GET
または$_POST
に固執します。 Also2は、@zerkmsが指摘するように、データベースクエリで使用することは想定されていませんmysql_real_escaping
変数にはポイントがありません、それはさらに問題につながる可能性があります。
なお、実際には、なしの、これがすべてでは特に良いアイデアがあるの、あなただけの過去の年齢から恐ろしいPHP慣行だったmagic_quotesのとglobal_varsを、転生しています。使用は$_GET
またはfilter_input
てmysqliのやPDOや利用価値を介して結合パラメータを持つ文を作成しました。 http://www.phptherightway.com のを参照してください。
他のヒント
また、
ということを達成するために、このような再帰関数を使用することができますfunction sanitate($array) {
foreach($array as $key=>$value) {
if(is_array($value)) { sanitate($value); }
else { $array[$key] = mysql_real_escape_string($value); }
}
return $array;
}
sanitate($_POST);
私の知る限りは、11月19日'10からStarx」とライアンの答えを懸念してるよう最善の解決策はここにある。
あなたは、彼らが$ _POST、アレイ内のアレイに保存されますつまり、一つの名前(例:名前[])で複数の入力フィールドを持っている場合は、は、あなたはmysql_real_escape_stringのは、配列のための仕事をしないよう、再帰関数を使用する必要があります。
このですから、このような$ _POST変数を脱出する唯一のソリューションです。
function sanitate($array) {
foreach($array as $key=>$value) {
if(is_array($value)) { sanitate($value); }
else { $array[$key] = mysql_real_escape_string($value); }
}
return $array;
}
sanitate($_POST);
サニタイズするまたは検証すの他 INPUT_GET
, INPUT_POST
, INPUT_COOKIE
, INPUT_SERVER
, や INPUT_ENV
, 利用でき
filter_input_array
—が外部変数を任意にフィルしてい
フィルタリングできるコールバックでも供給 mysql_real_escape_string
.
この方法で許さないフィルタリング $_REQUEST
, ので、 すべて正常に動作するとは限りません $_REQUEST
データベースにおいて利用可能となったのその他のsuperglobals.する。
の方法も必要としている事実が名を入力キーにしているのではなく、汎用のバッチフィルタリングしたい場合は汎用のバッチフィルタリングを使用 array_map
または array_walk
または array_filter
図のようなこのページです。
また、なぜ用のmysql拡張子ではなく、 mysqli (iを向上させます。のmysqli延長のお支援 取引, multiqueries や 諸表の作成 (する必要がなく逃げ)すべての機能をできるだDBコードにより信頼する理解を深めているようです。
あなたはをmysqliのの拡張機能を使用している場合は、すべてのGET変数をエスケープしたい:
$escaped_get = array_map(array($mysqli, 'real_escape_string'), $_GET);
別の方法として、私が使用することを助言することができ PHP7入力フィルタを、どのSQLエスケープへのショートカットを提供します。私は、それ自体がそれをお勧めしないのだが、それはローカライズされた変数を作成惜しみます:
$_REQUEST->sql['kkld']
SQLクエリ文字列にインラインで使用され、余分な警告を与えることができます。あなたはそれを忘れなければならない。
mysql_query("SELECT x FROM y WHERE z = '{$_REQUEST->sql['kkld']}'");
これは、構文的に疑問だが、あなたが本当にそれを必要とするだけでそれらの変数をエスケープすることができます。それともあなたが尋ね、使用をエミュレートする$_REQUEST->sql->always();