PHPのバグ?(変数名による混同)

PHPでコーディングしていてたまーに引っかかる部分なので、メモっておきます。
PHPなどではデータの受け渡しなどでPOSTGETのメソッドは多用するのであるが、このデータの受け取りにはスーパーグローバル変数の$_POST[’key_name’]($_GET[’key_name’])で受け取る場合が多いと思うが、ここに大きな落とし穴があります
$_POST[’key_name’]($_GET[’key_name’])は文字通りスパーグローバル変数であるが、うっかりこの’key_name’と同じ名前のローカル変数($key_name)を使ったりすると$key_nameの内容が不安定になります。
基本的に、プログラム上$_POST[’key_name’]$key_nameは別の変数と捉えられると考えるが、PHPでは明確に区別が付かずに混同して解釈されてしまうことが多々発生します。
この事は$_SESSION['key_name’]などでも同じような現象が発生します。

以前からこのような現象は起きていましたが、今回少し調べて見ました

その結果、次のような事が判明・・・
この、スパーグローバル変数の取り扱いは、php.iniの中のregister_globals の設定で変わる事が判明。これはPHP 4.2.0以降にデフォルトがOffに設定されているようで、この設定をOnにすると、$_POST[’key_name’]$key_nameとして扱うことが可能になるようである。
わざわざデフォルトをOffにしたのはやはりセキュリティ的な問題からのようで、個人的にはOffのままがお勧めかと思いますし、やはりスーパーグローバル変数とローカル変数は明示的(意識してプログラムする)に動作して欲しいのでOffの方がプログラム上良いような気がします。

セキュリティに関する参考記事・・・
http://itpro.nikkeibp.co.jp/article/NEWS/20051102/223939/?ST=security


新しい書込をする
「仕様・不具合」等に関してはここで書き込まずに「メールフォーム」にてお願いします!
既に投稿されている内容への返信は各投稿内容に付いている「返信」ボタンから行って下さい。

 No:  タイトル:
1970-01-01 09:00
 
お名前:
削除 編集 返信