8

私は最近、PHPスクリプトでこの行に出くわしました。

$_REQUEST['start_date']=$date;

スーパーグローバル$_REQUEST変数に何かを割り当てることは許可されていますか、または何らかの方法で役立ちますか?$ _COOKIE ['start_date']がある場合、これによりCookieの値が変更されますか?

4

3 に答える 3

8

はい、許可されており、さまざまな理由で役立つ可能性があります。

  • デバッグ-何らかの理由で特定のリクエストパラメータを「強制」する場合は、、、、または配列$_REQUESTに値を設定できます。これにより、要求元のページから送信された値が上書きされます。$_GET$_POST
  • 配列全体で何かを行うため、たとえば、json_encodeすべての$_REQUESTキーと値のペア$_REQUESTいくつかの追加の値が必要な場合は、この方法で値を「追加」する方が速い場合があります。、次にに渡し$_REQUESTますjson_encode()

についての質問に関して$_COOKIEは、Cookieの値をそのように変更することはできず、アクセスするだけです。

著者からのメモ:次の例は、私の元の回答に対する提案および承認された編集として追加されました。そして、それは機能するかもしれませんが、インジェクション攻撃からサイトを保護するためのより良い方法があります(例えば、プリペアドステートメント)。賢明なプログラマーであるIMHOは、以下のコードに依存する前に、これらのアプローチを強く検討する必要があります。

WebサイトへのSQLインジェクション攻撃を防ぐことを検討してください。その単純なコードは、すべての$_REQUEST変数に対してそれらを停止します(mysqliの例):

function injectionwall($dbinterface)
{
    foreach($_REQUEST as $key => $data)
    {
        $_REQUEST[$key]=$dbinterface->real_escape_string($data);
    }
}

すべての$_REQUEST変数を安全に使用できるようになりました:)

于 2012-06-19T08:27:45.750 に答える
3

より適切な対応は、「はい、許可されていますが、悪い習慣だと考えているので、プログラミング品質を向上させるために避けてください」だと思います。

なぜそれが許可されるのか(そしておそらくあなたの質問のポイント):

  • SuperGlobalsは、プログラム実行の開始時に設定され、それ以外の場合は変更されません(変更しない限り)。したがって、変更は永続的であり、他の機能で簡単に確認できます。さあ、好きなように編集してください。

しかし-なぜ避けるのが最善か:

  • 一般に、変数が何であり、それらがどこから来ているのかを知ることは良い習慣です。$ _REQUESTを操作することにより、すべての入力を「安全にする」関数があるとします。$ _REQUESTを使用するようになると、「安全にする」機能が実行されたかどうかを確認できなくなります。ユニットテストを行う場合、これは特に問題になります。$ _REQUESTを別の変数に再割り当てすると、その変数のスコープをより簡単に追跡できます。他の変数を「グローバル」にしたとしても、それが存在しても安全であることがわかります。(欠点は、非常に重いアプリのメモリ/プログラミング能力を浪費している可能性がありますが、この質問をしている場合は、それから遠く離れています。)

  • $ _REQUESTを変更する場合、$ _ POST、$ _ GET、または$_COOKIEは編集していません。将来的にコードを$_POSTに変更したい場合、これは混乱を招く可能性があります(たとえば、「安全にした」と思うデータは変更されません)。

最後に、一般的な$_REQUESTの使用に関する2つの簡単なメモ:

  • $ _REQUESTは、$ _ COOKIE、$ _ POST、および$ _GET(および古いバージョンでは$ _FILES)の組み合わせです。ただし、php.iniファイル( http://www.php.net/manual/en/ini.core.php#ini.variables-order)を読まない限り、どちらが優先されるかはわかりません。したがって、$_GETよりも$_POSTが優先されることに依存しないでください。

  • 可能であれば、$ _ POST、$ _ GET、または$ _COOKIEを使用するもう1つの理由:-将来の開発者は、変数の出所を正確に把握しているため、コードのデバッグが容易になります。ただし、値がCookieからのものか、getからのものか、postからのものかを本当に気にしない場合は、$_REQUESTが適切な場合があります。

免責事項:はい、私は$ _REQUESTを使用し、はい、いくつかの状況を回避するためにそれを変更しました。あなたがより良いプログラマーになりたいのなら、そうしないでくださいと言っているだけです。

于 2012-06-19T10:16:18.550 に答える
0

スーパーグローバル$_REQUEST変数に何かを割り当てることは許可されていますか、または何らかの方法で役立ちますか?

はい、許可されていますが、役に立ちません。

$ _COOKIE ['start_date']がある場合、これによりCookieの値が変更されますか?

いいえ、setcookiehttp://php.net/manual/en/function.setcookie.phpを使用します

このすべてのスーパーグローバル変数は、単純なグローバル配列です。

于 2012-06-19T08:19:21.213 に答える