個人的なメモと備忘録 2005年12月

HOME | LastUpdate: 2005-12-26

目次


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 修正)

変数を使用すると変数汚染が避けられないことに気が付きましたので、コードを修正しました。やはり関数にした方が良さそうです。

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

?>
*PHP 5.1.1 公開

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.0 では組み込みの Date クラスが PEAR::Date パッケージと名前空間が競合していたため、組み込みの Date クラスを無効に修正
  • スクリプトの最終行がコメントだった場合に致命的エラーが発生する場合がある問題を修正
  • eval() 関数で評価するコードの最終行がコメントだった場合にハングアップする問題を修正
  • PHP 5.1.0 で "\{$var}" と記述すると、{} で囲まれた $var の内容が返されるのではなく、{$var} が返されてしまう問題を修正
  • PHP_AUTH_DIGEST のフォーマットが Apache 1.x と Apache 2.x で一致しない問題を修正
  • cURL 拡張モジュール内での safe_mode/open_basedir のチェックを改善

PHP 5.1.2RC1 では、以下のような変更・修正が行われているようです(PHP 5.1.2RC1 Released!から)。

  • strtotime() のバグ修正
  • 多くの PDO とドライバの修正
  • 大量の OCI8 のバグを開発版かバックポート
  • Apache 2 で SSI から PHP を呼び出すとクラッシュするバグを修正
  • 拡張モジュールやコアコンポーネントでの多くのクラッシュバグを修正
  • ライブラリ(sqlite, pdo_sqlite, SimpleXML, SPL など)のアップデート・拡張モジュールの改善
  • XMLWriterHash (PHP Manual: hash Functions) を追加(デフォルトで有効)
*mb_send_mail() の To: に改行が含まれていると任意のメールヘッダを追加されてしまう問題

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 (Sebastian Bergmann)

    もうすぐ PHPUnit 3.0 が公開予定(2006年1月)だそうです。

  • Top 7 PHP Security Blunders (SitePoint)

    PHP でセキュリティ問題を発生しやすい部分のコードの指摘と、その対処方法が紹介されています。

  • Hardened-PHP 0.4.8

    PHP 4.4.1 / PHP 5.0.5 / PHP 5.1.1 に対するセキュリティ強化 Patch が公開されていました。

  • Zend Optimizer 2.6

    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 の問題ということではないことに注意する必要がありそうです。

*Apache

Apache の mod_imap に Referer を通してクロスサイトスクリプティング可能という問題が報告されています。Apache 1.4.34 以下、Apache 2.0.55 以下、Apache 2.2.0 で影響を受けるようです。

>>気になったニュース、ツールなど

▲ 目次へ戻る


更新履歴

2005.12.26

register_globals が On の環境でも Off と同様の状態にする方法(2) のコードを修正。

2005.12.25

このページを作成。2005年12月25日分を追加。

▲ 目次へ戻る

LastUpdate: 2005-12-26 | HOME