3

以下以外に、提出された変数を安全に抽出する簡単な方法はありますか?

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()この文脈で使用しますか?)

4

6 に答える 6

31

すべての変数を一度にエスケープするには:

$escapedGet = array_map('mysql_real_escape_string', $_GET);

すべての変数を現在の名前空間に抽出するには(つまり$foo = $_GET['foo']

extract($escapedGet);

ただし、この最後のステップは実行しないでください。必要はありません。値を配列のままにしておくだけです。変数を抽出すると、名前の衝突や既存の変数の上書きが発生する可能性があります。これは、面倒でバグの原因であるだけでなく、セキュリティ上のリスクもあります。また、@ BoltClockが言うように、またはに固執し$_GETます$_POST。また、@ zerkmsが指摘してmysql_real_escapingいるように、データベースクエリで使用されることを想定していない変数には意味がなく、さらに問題が発生する可能性があります。


これは特に良い考えではないことに注意してください。昔からの恐ろしいPHPの慣習であったmagic_quotesとglobal_varsを転生させているだけです。mysqliまたはPDOを介してバインドされたパラメーターを持つプリペアドステートメントを使用し、またはを介して値を使用し$_GETますfilter_inputhttp://www.phptherightway.comを参照してください。

于 2010-11-19T07:52:14.123 に答える
4

このような再帰関数を使用して、それを実現することもできます

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);
于 2010-11-19T07:53:29.120 に答える
1

INPUT_GETINPUT_POSTINPUT_COOKIEINPUT_SERVER、またはをサニタイズまたは検証するにはINPUT_ENV、次を使用できます。

  • filter_input_array— 外部変数を取得し、必要に応じてそれらをフィルタリングします

フィルタリングはコールバックで実行できるため、mysql_real_escape_string.

この方法では、 のフィルタリングはできません。データが他のスーパーグローバルのいずれかで利用できる場合は使用できない$_REQUESTためです。安全でない可能性があります。$_REQUEST

このメソッドでは、入力キーに名前を付ける必要もあるため、一般的なバッチ フィルタリングではありません。一般的なバッチ フィルタリングが必要な場合は、このページの他の場所に示されているようにarray_mapまたはarray_walkまたはを使用します。array_filter

また、mysqli (改善された i) 拡張機能ではなく、古い mysql 拡張機能を使用しているのはなぜですか。mysqli 拡張機能は、トランザクションマルチクエリ、および準備済みステートメント(エスケープの必要性を排除する) をサポートします。DB コードの信頼性と安全性を大幅に高めるすべての機能。

于 2010-11-19T08:10:35.483 に答える
0

私に関する限り、Starx' と Ryan の 10 年 11 月 19 日の回答は、私もこれが必要だったので、ここでの最良の解決策です。

1 つの名前 (names[] など) を持つ複数の入力フィールドがある場合、それらは $_POST-array 内の配列に保存されることを意味し、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);
于 2015-02-13T13:54:35.573 に答える
-2

別の方法として、 SQLエスケープへのショートカットを提供するPHP7入力フィルターを使用することをお勧めします。それ自体はお勧めしませんが、ローカライズされた変数を作成する必要はありません。

 $_REQUEST->sql['kkld']

これはSQLクエリ文字列でインラインで使用でき、忘れた場合は追加の警告を表示します。

 mysql_query("SELECT x FROM y WHERE z = '{$_REQUEST->sql['kkld']}'");

構文的には疑わしいですが、実際にそれを必要とする変数のみをエスケープできます。または、要求したものをエミュレートするには、$_REQUEST->sql->always();

于 2010-11-19T09:21:30.293 に答える