wp-settings.php (2)
前回は「wp-settings.php」の一部についてみていきました。
「wp-settings.php」の前回までのところを復習します。
①phpのメモリ上限の設定
php.iniの設定で32M以上の実行メモリが設定されていなかった場合、「ini_set」で32Mに設定しました。
②「magic_quotes_runtime」「magic_quotes_sybase」の設定
バックスラッシュやシングルクォートによる自動エスケープをオフにしました。
今回はこの後の処理をみていきます。
③「register_globals」が「ON」の場合のセキュリティー対策
「register_globals = On」の場合、GET、POST メソッドなどの値は自動的に「$変数名」で格納されます。
(例1)
⇒ $get_test = "a";
(例2)
⇒$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」が削除されます。
では、関数を具体的にみていきます。
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 でした名前のキーに関しては削除対象から除外にしています。
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」自体がなくなるようです。今ではほとんど気にする必要がない処理かもしれません。



