私は最近、PHPスクリプトでこの行に出くわしました。
$_REQUEST['start_date']=$date;
スーパーグローバル$_REQUEST変数に何かを割り当てることは許可されていますか、または何らかの方法で役立ちますか?$ _COOKIE ['start_date']がある場合、これによりCookieの値が変更されますか?
私は最近、PHPスクリプトでこの行に出くわしました。
$_REQUEST['start_date']=$date;
スーパーグローバル$_REQUEST変数に何かを割り当てることは許可されていますか、または何らかの方法で役立ちますか?$ _COOKIE ['start_date']がある場合、これによりCookieの値が変更されますか?
はい、許可されており、さまざまな理由で役立つ可能性があります。
$_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
変数を安全に使用できるようになりました:)
より適切な対応は、「はい、許可されていますが、悪い習慣だと考えているので、プログラミング品質を向上させるために避けてください」だと思います。
なぜそれが許可されるのか(そしておそらくあなたの質問のポイント):
しかし-なぜ避けるのが最善か:
一般に、変数が何であり、それらがどこから来ているのかを知ることは良い習慣です。$ _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を使用し、はい、いくつかの状況を回避するためにそれを変更しました。あなたがより良いプログラマーになりたいのなら、そうしないでくださいと言っているだけです。
スーパーグローバル$_REQUEST変数に何かを割り当てることは許可されていますか、または何らかの方法で役立ちますか?
はい、許可されていますが、役に立ちません。
$ _COOKIE ['start_date']がある場合、これによりCookieの値が変更されますか?
いいえ、setcookiehttp://php.net/manual/en/function.setcookie.phpを使用します
このすべてのスーパーグローバル変数は、単純なグローバル配列です。