関数 wp_unregister_GLOBALS() 完了
2014/12/05
目次
register_globals が On の環境でも Off と同様の状態にする関数を定義
定義ファイル :/blog/wp-includes/load.php
呼出元 :/blog/wp-settings.php
この関数は
register_globals が On の環境でも Off と同様の状態にする方法
を目的としています。
phpマニュアルに記載があります。
私はどのように register_globals を扱うべきですか?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function wp_unregister_GLOBALS() { if ( !ini_get( 'register_globals' ) ) return; if ( isset( $_REQUEST['GLOBALS'] ) ) die( 'GLOBALS overwrite attempt detected' ); // Variables that shouldn't be unset $no_unset = array( 'GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES', 'table_prefix' ); $input = array_merge( $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset( $_SESSION ) && is_array( $_SESSION ) ? $_SESSION : array() ); foreach ( $input as $k => $v ) if ( !in_array( $k, $no_unset ) && isset( $GLOBALS[$k] ) ) { unset( $GLOBALS[$k] ); } } } |
関数
ini_get()
isset()
die()
array_merge()
is_array()
array()
in_array()
isset()
unset()
php.ini
register_globals が有効でない場合は以降の処理は行わない
「register_globals = On」の場合に問題になる。
OFF(false)の場合は何も処理する必要なし。
「return」で関数から抜る。
$_REQUEST に GLOBALS が含まれている場合はグローバル変数が上書きされる可能性があるため、処理を終了
削除しないグローバル変数名をキーとした配列を作成
1 | $no_unset = array( 'GLOBALS' => '', '_GET' => '', '_POST' => '', '_COOKIE' => '','_REQUEST' => '', '_SERVER' => '', '_ENV' => '', '_FILES' => '' ); |
WordPressのオリジナル
table_prefix
グローバル変数として登録される変数名をキーにした配列を作成
登録されたグローバル変数を削除
2005.12.25(Sun)
>>PHP
*register_globals が On の環境でも Off と同様の状態にする方法(2)はてなの日記(register_globals (t_komuraの日記))の方にいろいろと書いていたのですが、その後、Yet more on cleaning input data (phpguru.org) というページで既にこの問題について対処方法が提示されていました。この方法で十分のように思います。
この関数を元に、少し書き直したコードを掲載しておきます。実際の処理内容は同一ですが、in_array() を使用しないようにしている点が異なっています。必要に応じて関数にする、使用しないグローバル変数も削除するなど修正を行って使用すれば良いと思います。これをスクリプトの最初に置いておくとグローバル変数の上書き問題とグローバル変数の汚染については回避できそうです。
(2005.12.26 修正)
変数を使用すると変数汚染が避けられないことに気が付きましたので、コードを修正しました。やはり関数にした方が良さそうです。
12345678910111213141516171819202122232425262728 <?phpfunction 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();?>以下のような関数にすれば、HTTP_*_VARS などのあまり使用しない変数も削除することができます。
12345678910111213141516171819202122232425262728293031 <?phpfunction unset_register_globals(){if ( ini_get( 'register_globals' ) ) {// $_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] );}}}foreach ( array_keys( $GLOBALS ) as $k ) {if ( $k{0} !== '_' && $k !== 'GLOBALS' ) {unset( $GLOBALS[$k] );}}}unset_register_globals();?>Yet more on cleaning input data (phpguru.org)
register_globals が On の環境でも Off と同様の状態にする方法 (2005.05.05 の過去ログから)
外部リンク
個人的なメモと備忘録