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

HOME | LastUpdate: 2005-07-17

目次


2005.07.17(Sun)

PHP と Web アプリケーションのセキュリティについてのメモSession Fixation を起こす方法 に少しだけ追記しました。

wwwcheck.php で PHP 4.4.0 でリファレンス関連のエラーが表示される問題に対応しました。

>>PHP 関連

*セッションハイジャック対策

本当にセッションハイジャック対策になるのかは分かりませんが、興味深いのでメモしておきます。

Chris Shiflett: PHP Security Forum で知ったのですが、Question about session hijacking の議論でWeb アプリケーションへのアクセス中に User Agent や Accept Charset などの HTTP ヘッダ文字列を変更するような人はほとんどいないという事を利用して、以下のような関数が挙げられていました(この関数はセッション管理クラスの中で使用されることを想定しているようですので、このままでは使えません)。

// get the fingerprint of the user
function getFingerprint()
{
    $fingerprint = $this->secret;
    if (array_key_exists('HTTP_USER_AGENT', $_SERVER)) 
    {
        $fingerprint .= $_SERVER['HTTP_USER_AGENT'];
    }
    if (array_key_exists('HTTP_ACCEPT_CHARSET', $_SERVER))
    {
        $fingerprint .= $_SERVER['HTTP_ACCEPT_CHARSET'];
    }
    $fingerprint .= session_id();
    $fingerprint = md5($fingerprint);
    return $fingerprint;
}

フィンガープリントを取っておいて、違う場合はログに書き込む、またはエラーメッセージを返すなどの対処を行うと、セッション ID を盗まれたとしても、盗んだ相手の User Agent や Accept Charset を同じにしなければ検出できますし、セッションハイジャックを防止できる可能性が高くなりますので、対策の一つとしては有効かもしれません。

Proxy を使用していると、IP アドレスが変更されたりすることは多いのですが、User Agent や Accept Charset をアクセス毎に変更するブラウザは多くはないと思います。うまく使えば有効な対策になるかもしれません。

*ifsetor()

少し前になりますが、PHP 開発者メーリングリスト(php.internals)で興味深い議論がありましたのでメモしておきます([PHP-DEV] PHP 5.1)。

以下のような ifsetor() 関数の実装例が提案されています。

function ifsetor( &$x, $default = NULL )
{
    if ( ! isset( $x ) ) {
        $x = $default;
    }
    return $x;
}
$a = ifsetor( $_GET['a'], '' );
$b = ifsetor( $_GET['b'], '' );

それまで知らなかったのですが、関数の引数をリファレンスにすると、未定義エラーは発生しないようです(PHP 4.2.2 以降で確認)。関数を呼び出す分、速度は少し遅くなりますが、以下のように書くよりはかなり読みやすいコードになると思います。2 回も同じ変数を書く必要がないというのは大きなメリットかもしれません。

$a = isset( $_GET['a'] ) ? $_GET['a'] : '';
$b = isset( $_GET['b'] ) ? $_GET['b'] : '';
*Path Disclosure and PHP

Path Disclosure and PHP - iBlog - Ilia Alshanetsky によると、本来、script.php?name=foo のように入力変数の受け取りを期待しているスクリプトで、script.php?name[]=foo のような形で入力変数を受け取ると、スクリプトによってはエラーが発生し、ディレクトリパスが表示されてしまうという問題があるそうです。

対策として、以下のようにエラーをブラウザに表示しないように設定し、別でファイルにログを記録する方法と、受け取り時にキャストを使用して型を強制してしまうという方法が挙げられています。

<?php

ini_set(“display_errors”, 0);
ini_set(“log_errors”, 1);
ini_set(“error_log”, “/path/to/php/errors”);

?>
*PHP 4.4.0 と PHP 5.1beta3 公開

PHP 4.4.0 と PHP 5.1 beta3 が公開されています。

PHP 4.4.0 では、バグ修正のみですが、リファレンスによるメモリ破壊のバグが修正されています。リファレンス関連でエラーが発生する可能性がありますので、バージョンアップの際にはテストを行っておいた方が安全です。

また、mb_mime_encoding() 関数に問題があり、mb_send_mail() などで日本語の件名が文字化けする可能性がある問題が報告されていますので、注意してください([PHP-users 26184] PHP4.4.0でメールを送信すると、題名が文字化けします。)。

*その他

>>セキュリティ関係

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

▲ 目次へ戻る


2005.07.10(Sun)

少し古いものが多いですが、忘れてしまいそうなものが増えてきましたので、忘れない間にメモだけでも残しておきます。

>>PHP 関連

*XMLRPC のセキュリティ問題

PEAR などの XMLRPC の実装で、PHP コードの実行を許してしまうセキュリティ問題が発見されています。XMLRPC を使用している PHP スクリプトで影響を受けますので、最新版にアップデートしてください。

PEAR であれば、pear upgrade XML_RPC を実行すれば最新版にアップデートされます。

XML-RPC for PHP Remote Code Injection Vulnerability (SecurityFous) でこの問題の影響を受ける製品一覧がまとめられています。確認しておくと良いと思います。

PHP Security Consortium: SecurityFocus Summaries によると、XMLRPC のセキュリティ問題の影響を受ける主な製品とバージョンが以下のようにまとめられています。

  • Serendipity 0.8.2
  • PEAR XML_RPC 1.3.1 (and 1.3.2 fixes additional vulnerabilities)
  • XML-RPC for PHP 1.1.1
  • Drupal 4.6.2 or 4.5.4
  • Xoops 2.0.12a
  • phpMyFAQ 1.4.9 or 1.5.0 RC5
  • WordPress 1.5.1.3
  • Nucleus CMS 3.21
  • phpAdsNew 2.0.5
  • phpPgAds 2.0.5

引用: SecurityFocus Summaries: Alerts from SecurityFocus Newsletter #306

その他のリンク

*SecurityFocus Summaries

PHP Security Consortium で、PHP に関連したセキュリティ問題のみを取り上げたSecurityFocus Summaries が開始されています。PHP 自体のセキュリティ問題、PHP を使用した製品の他、Mozilla などのブラウザや Apache などの関連性のあるセキュリティ問題が取り上げられています。PHP 関連のセキュリティ問題を確認するのに非常に便利です。

*PHP 4.4.0 RC2 と PHP 5.1 beta2 公開

PHP 4.4.0RC2 と PHP 5.1.beta2 が公開されています。PHP 4.4.0 では、致命的なリファレンスのに関するバグ(Bug #29423: reference count gets wrong when return-reference-calling a normal function,Bug #32685: Segfault when using assignment by reference within function)が修正されています。この変更に伴い、PHP 4.3.x とはバイナリレベルので互換性が取れない可能性があるそうです。

詳しくは、PHP 5.1 beta2 の NEWS と、PHP 4.4.0RC2 の NEWS を参照してください。

*その他

>>セキュリティ関係

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

▲ 目次へ戻る


更新履歴

2005.07.17

2005年 7月17日分を追加。

2005.07.10

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

▲ 目次へ戻る

LastUpdate: 2005-07-17 | HOME