0

私は自分で PHP を学んでおり、デフォルトで register_globals がオンになっている Web ホスト アカウントを使用してスクリプトをテストしました。これが安全ではないことはわかっていますが、サンプル コードをテストするときは気にしませんでした。

現在、私がメンバーである非営利団体の小さなライブサイトに取り組んでおり、彼らが使用しているホストでは、デフォルトで register_globals がオフになっています。

それで、今私の質問です。私はこの作業に慣れています(register_globalsをオンにして):

index.php?pID=1 をロードしているとします。index.php のコードには、次の行が含まれます。

if($pID==1) include('content1.php');

$_GET['pID'] ではなく $pID を使用しており、コードのどこにも $_GET['pID'] を $pID に割り当てていないことに注意してください。これはとにかくうまくいきました。だから (もちろん) 組織ホストで同じコードを使用しているときに、これが突然機能しなくなったのは、register_globals がオフになっているためなのだろうか?

もしそうなら、スーパーグローバルを再び魔法にするための回避策はありますか、それともすべての $_GET 変数を自分のグローバルに手動で割り当てる必要がありますか?

4

1 に答える 1

0

を実装しようとしないregister_globalsでください。これは巨大なセキュリティ ホールであり、そもそも実装すべきではありませんでした。したがって、PHP 5.3 で廃止され、PHP 5.4で削除された理由です。

変数を再割り当てする必要はありません。変数を$_GET同等のものに置き換えるだけです。IE

if($pID==1) include('content1.php');

なるべき

if($_GET['pID']==1) include('content1.php');

がなぜregister_globals悪かったのかを示すために、次の簡単な例を見てください。

if(login_success('admin')) {
  $admin = 1;
}

if($admin == 1) {
  require('super-secret-admin-file.php');
}

$adminはどこにも初期化されないため、register_globalsオンにして開いたfile.php?admin=1場合、管理者であるかどうかに関係なく、サイトの管理セクションにアクセスできます。

于 2013-07-25T14:57:33.727 に答える