wp-settings.php (2)


[wp-settings.php 解析 | WP2.7 関連記事]
WordPrss3.5 wp-settings.php 解析はこちら

前回は「wp-settings.php」の一部についてみていきました。
「wp-settings.php」の前回までのところを復習します。

①phpのメモリ上限の設定
php.iniの設定で32M以上の実行メモリが設定されていなかった場合、「ini_set」で32Mに設定しました。

②「magic_quotes_runtime」「magic_quotes_sybase」の設定
バックスラッシュやシングルクォートによる自動エスケープをオフにしました。

今回はこの後の処理をみていきます。

analyze08

【wp-settings.php】

③「register_globals」が「ON」の場合のセキュリティー対策

analyze09

「register_globals = On」の場合、GET、POST メソッドなどの値は自動的に「$変数名」で格納されます。

(例1)

index.php?get_test=a
⇒  $get_test = "a";

(例2)

<input type="hidden" name="post_test" value="b">
$post_test = "b";

使用する変数を初期化すればそれほど問題にならないのですが、初期化しない場合などに不具合が生じることがあります。

(例)
復習です。入り口の「index.php」から「wp-blog-header.php」を読み込んでました。
「wp-blog-header.php」内の処理は、

if ( !isset($wp_did_header) ) { 〇〇〇 }

と記述されていましたので、変数「$wp_did_header」が存在しない場合のみ行います。
ここで、もし「index.php?wp_did_header=123」のようなURLでアクセスした場合、

$wp_did_header = 123;

と自動的に変数ができ格納され、変数「$wp_did_header」が存在するので、「wp-blog-header.php」内の処理が行われなく終わってしまいます。
このように、プログラムに不具合が起こす可能性があるので「register_globals = On」の場合は、グローバル変数をNULLにした後、削除する処理を「wordpress」は行っています。つまり、上記例では、自動的にできた「$wp_did_header」が削除されます。

「function wp_unregister_GLOBALS() 」関数

では、関数を具体的にみていきます。

if ( !ini_get('register_globals') )
return;

「register_globals = On」の場合に問題になるわけですから、OFF(false)の場合は何も処理する必要ありません。「return」で関数から抜けます。

$input = array_merge($_GET, $_POST, ・・・・・・);

全てのスーパーグローバル値を1つの配列にまとめています。

    $noUnset = array('GLOBALS', '_GET', '_POST', '_COOKIE', ・・・・);
    foreach ( $input as $k => $v )
        if ( !in_array($k, $noUnset) && isset($GLOBALS[$k]) ) {
            $GLOBALS[$k] = NULL;
            unset($GLOBALS[$k]);
        }
    }

スーパーグローバルのキーが「$キー」の変数に自動的になっているので、ループしながら「$キー」の変数をNULLにし($GLOBALS[$k] = NULL)、そして削除(unset($GLOBALS[$k])) しています。
ただし、$noUnset でした名前のキーに関しては削除対象から除外にしています。

if ( isset($_REQUEST['GLOBALS']) )
die('グローバル変数を上書きするおそれがあるため、処理を中止します。');

例えば、「index.php?GLOBALS[wp_did_header]=1」のようなURLの記述ができます。GETメソッドのキーに[]をつけると配列で渡すことができます。

$GLOBALS[wp_did_header] は、 グローバル変数$wp_did_headerと同じですから、上記の問題と同じことがでてきます。$GLOBALSは対処がしにくいので、GET、POST メソッドなどのキーに「GLOBALS」があれば、エラー表示して中断しているようです。


PHP 4.2.0 からデフォルトが「OFF」に、php6からは「register_globals」自体がなくなるようです。今ではほとんど気にする必要がない処理かもしれません。


[wp-settings.php 解析 | WP2.7 関連記事]
WordPrss3.5 wp-settings.php 解析はこちら

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です