register_globals が On の環境でも Off と同様の状態にする方法

  http://www.asahi-net.or.jp/~wv7y-kmr/note/2005-12.html#YMD20051225_PHP_reg ...

  PHP 4.2.0 から register_globals は Off になっているのだけれども,
  古いスクリプトは register_globals が On であることを前提にかかれている場合も多い.
  実際,保守しているものの中にも多数ある.

  以下,上記サイトで公開されている関数を使用することでグローバル変数の汚染については回避できそう.

<?php

function unset_register_globals()
{
    // register_globals が有効でない場合は以降の処理は行わない
    if ( ini_get( 'register_globals' ) ) {
        return;
    }
    // $_REQUEST に GLOBALS が含まれている場合はグローバル変数が上書きされる可能性があるため、処理を終了
    if ( isset( $_REQUEST['GLOBALS'] ) ) {
        exit( 'GLOBALS overwrite attempt detected' );
    }
    // 削除しないグローバル変数名をキーとした配列を作成
    $no_unset = array( 'GLOBALS'  => '', '_GET'    => '', '_POST' => '', '_COOKIE' => '',
                      '_REQUEST'  => '', '_SERVER' => '', '_ENV'  => '', '_FILES'  => '' );

    // グローバル変数として登録される変数名をキーにした配列を作成
    $input = array_merge( $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES,
                          isset( $_SESSION ) ? (array)$_SESSION : array() );

    // 登録されたグローバル変数を削除
    foreach ( array_keys( $input ) as $k ) {
        if ( ! isset( $no_unset[$k] ) && isset( $GLOBALS[$k] ) ) {
            unset( $GLOBALS[$k] );
        }
    }
}
unset_register_globals();

?>