HOME | LastUpdate: 2005-12-26
はてなの日記(register_globals (t_komuraの日記))の方にいろいろと書いていたのですが、その後、Yet more on cleaning input data (phpguru.org) というページで既にこの問題について対処方法が提示されていました。この方法で十分のように思います。
この関数を元に、少し書き直したコードを掲載しておきます。実際の処理内容は同一ですが、in_array()
を使用しないようにしている点が異なっています。必要に応じて関数にする、使用しないグローバル変数も削除するなど修正を行って使用すれば良いと思います。これをスクリプトの最初に置いておくとグローバル変数の上書き問題とグローバル変数の汚染については回避できそうです。
(2005.12.26 修正)
変数を使用すると変数汚染が避けられないことに気が付きましたので、コードを修正しました。やはり関数にした方が良さそうです。
<?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(); ?>
以下のような関数にすれば、HTTP_*_VARS
などのあまり使用しない変数も削除することができます。
<?php function 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(); ?>
1ヶ月くらい前になりますが、PHP 5.1.1 (2005.11.28) が公開されています。PHP 5.1.0 で報告されている致命的なバグが修正されています。また、PHP 5.1.2RC1 (2005.12.22) も公開されました。
PHP 5.1.1 では主に以下の修正が行われています(PHP 5.1.1. Release Announcement から)。
PHP 5.1.2RC1 では、以下のような変更・修正が行われているようです(PHP 5.1.2RC1 Released!から)。
strtotime()
のバグ修正 PHP 4.4.1 以前と PHP 5.0.5 以前のバージョンで、mb_send_mail()
関数の To: (第1引数) に改行が含まれていると、メールヘッダの埋め込みが可能という問題が報告されています。
To: がメールアドレスとして正しいことを確認していればこの問題は特に気にする必要はありませんが、PHP 4.4.2RC1 以降と PHP 5.1.0 以降では To: に改行が含まれていてもメールヘッダが埋め込めないように対処されています。
もうすぐ PHPUnit 3.0 が公開予定(2006年1月)だそうです。
PHP でセキュリティ問題を発生しやすい部分のコードの指摘と、その対処方法が紹介されています。
PHP 4.4.1 / PHP 5.0.5 / PHP 5.1.1 に対するセキュリティ強化 Patch が公開されていました。
Zend Optimizer 2.6 で PHP 5.1.0 に対応したそうです。
現在は修正されているそうですが、Google でクロスサイトスクリプティングが可能な問題があったそうです。UTF-7エンコードされたタグ文字列によるXSS脆弱性に注意 (スラッシュドット・ジャパン)に詳しい解説があります。
以下のコードは Google XSS Example (Chris Shiflett: The PHP Blog) で掲載されていたコードを少し変更したものですが、文字コードが UTF-7 の場合、htmlspecialchars()
や、htmlentities()
関数ではタグをエスケープできないことが分かります。
<?php header( 'Content-Type: text/html; charset=UTF-7' ); $string = "<script>alert('XSS');</script>"; $string = mb_convert_encoding( $string, 'UTF-7' ); echo htmlspecialchars( $string ); ?>
UTF-7エンコードされたタグ文字列によるXSS脆弱性に注意 (hoshikuzu | star_dust の書斎) では、ISO-2022-JP を Shift_JIS に変換すると Javascript が起動するサンプルも紹介されていますので、UTF-7 の問題ということではないことに注意する必要がありそうです。
検証ページの紹介、ISO-2022-JP からエンコードを変更するとスクリプトが起動するサンプルの紹介などがあります。
PHP によるサンプルコードが掲載されています。
Apache の mod_imap に Referer を通してクロスサイトスクリプティング可能という問題が報告されています。Apache 1.4.34 以下、Apache 2.0.55 以下、Apache 2.2.0 で影響を受けるようです。
Atom の仕様書(RFC4287)。
HTTP サーバ。
データベースサーバ。細かいバグ修正が行われているようです。
オブジェクト指向言語。
register_globals が On の環境でも Off と同様の状態にする方法(2) のコードを修正。
このページを作成。2005年12月25日分を追加。
LastUpdate: 2005-12-26 | HOME