2

以前、プログラマーの 1 人と話をしていたところ、彼は検討中のコードを見せてくれました。

foreach($_REQUEST as $var=>$val) {
    $$var = addslashes($val);
}

$varName彼は書く代わりに使えるようにしたかった$_REQUEST['varName']

mysql_real_escape_string私は彼に、代わりにを使用し、変数をローカル スタックにaddSlashes置かないようにアドバイスしました。私には、古いディレクティブが抱えてい$_REQUESTたのと同じ問題のように思えます。REGISTER_GLOBALS

彼は、これらの変数はすべてローカル スタック上で作成されているため、同じセキュリティ リスクはないと述べました。だから私は確信が持てず、次のPHP変数変数ページをチェックアウトしました:http://www.php.net/manual/en/language.variables.variable.phpしかし、警告ボックス以外にスーパーグローバルとセキュリティへの参照は見られませんでした.

ハッカーはその構造を簡単に利用できますか?

4

5 に答える 5

2

私は何年も php をコーディングしていませんが、これを行う関数はありませんか? おそらく抽出と呼ばれますか?

ユーザーが入力したデータでその関数を使用する場合、いくつかの警告があります。これらの警告は、コード スニペットにも適用されます。

于 2010-10-21T02:53:39.347 に答える
2

これは、PHP のセキュリティ強化の 6 年間を巻き戻すようなものです...基本的にregister_globalsmagic_quotesまとめて! これら 2 つは、PHP の最近のバージョンでは非推奨としてマークされており、非常に正当な理由により、将来のバージョンから削除される予定です。

次のコードを想像してください。

if ($is_admin) {
    do_administrative_task();
}

ここで、誰かが次のリクエストを行います。

http://www.example.com/script.php?is_admin=1

そして、そのように、あなたは管理者です!

同様に、addslashes()最新の文字セットを理解しないため、SQL インジェクション攻撃に対する保護は実際には提供されません。addslashes()データベースをバイパスして pwn するようなものを作成するのは、ばかばかしいほど簡単です。

于 2010-10-21T03:05:00.743 に答える
1

「ローカルスタック」はそれとは何の関係もありません。プログラマーが予期していなかったコードの一部で、誰でも新しい変数を作成できます。

が本当にリクエストパラメータを取り出して$_REQUESTそれらすべての変数を作りたいのなら、コードが探すものだけを転送し、それ以上は転送しないでください。

そして溝addslashes()。これは、受信データをエスケープする場所が間違っているだけでなく、機能も間違っています。

于 2010-10-21T02:55:54.637 に答える
0

はい。リクエスト URL に次が含まれている場合...&GLOBALS[var]=1、対応するグローバル変数が上書きされます。

安全のために、少なくとも次の構造を検討する必要があります。

 extract($_REQUEST, EXTR_PREFIX_ALL, "var_");  // or EXTR_SKIP

これにより、ローカライズされた変数に少なくともプレフィックスが与えられ、グローバルの上書きが防止されます。array_map("addslashes", $_REQUEST) 適切な手段として、またはより適切なエスケープ関数も使用してください。しかし、実際には、これは単に別の名前の magic_quotes です。(トピック外: mysql_query をやめて、PDO と準備済みステートメントを使用してみてください。これは、よりシンプルで安全です。)

于 2010-10-21T02:55:02.560 に答える
0

そうです!問題のプログラマとして、ここには実際には 3 つの別個の問題があります。

  1. これは、デフォルトで PHPがおよびよりも優先されることを考えると、$_REQUESTそれほど安全ではありません。$_GET$_POST$_COOKIES$_GET$_POST
  2. スーパーグローバルの値の設定は、関数内のローカル変数やオブジェクト メソッドのローカル変数よりも安全です。
  3. 関数内でエンド ユーザーが作成した変数は、グローバルにアクセスできます。

上から始めましょう。

  1. $_POST$_GETよりも安全ではありません$_REQUEST。フォームから受け取ったすべての情報はダーティです。限目。関係なく。偽の Cookie を送信できれば、POST変数を偽造する方法がわかります。議論は無意味です。
  2. この変数$var.のスコープは、関数/メソッド内のみです。スーパーグローバルの内容をユーザー提供のデータの値に設定することは、関数/メソッド スタックが消去されたときにスクラブされるローカル変数よりも安全ですか? 私は疑問に思う...
  3. スニペットを見てみましょう

 

function some_function() {
   foreach($_POST as $var=>$val) {
        $$var = $val; 
  }
}

ここで、このコードと$_POST呼ばれる変数が含まれている場合、値を含むローカル変数が設定されます。ただし、スーパーグローバルはこれをオーバーライドし、への参照はローカル変数ではなくスーパーグローバルを参照するため、ローカルは参照できません。PHP のこの機能を考えると、global キーワードを使用せずにスーパーグローバルを完全にオーバーライドすることは通常不可能です。_POST$_POST$_POST$_POST

于 2010-10-22T02:55:51.153 に答える