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();
?>