残り一年! PHP4からPHP5への移行

第5回 セキュリティ関連の違い

この記事を読むのに必要な時間:およそ 5 分

session.cookie_httponly

PHP5のセッションモジュールのphp.ini設定から,Microsoft社独自のブラウザ拡張であるHttpOnlyクッキーを利用したセッションIDが利用できるようになりました。すべてのブラウザがHttpOnly属性を持つクッキーをサポートしてはいませんが,万が一WebアプリケーションにXSS脆弱性があった場合の影響を小さくすることができます。

Firefox 2.0.0.5からデフォルトでHttpOnlyがサポートされるようになりました。現在サポートされているInternet ExplorerもHttpOnlyクッキーに対応しています。JavaScriptでセッションIDクッキーを利用していないWebアプリケーションであれば,今までより安全に利用可能です。

注意:HttpOnlyクッキーは完全にはJavaScriptからセッションIDクッキーへのアクセスを防御できません。当然ですがHttpOnlyクッキーでは不正なJavaScript挿入によるページの書き換えも防げません。HttpOnlyクッキーを利用しても従来通りのクロスサイトスクリプティング,JavaScriptインジェクション対策は欠かせません。

この機能は互換性維持のためデフォルトでOffに設定されています。AJAXライブラリなどのセキュリティ対策にセッションIDを利用している場合,スクリプトからセッションIDクッキーにアクセスできずにアプリケーションが誤作動することを防ぐためです。

session.cookie_httponly = 1

に設定することによりセッションIDクッキーには自動的にHttpOnly属性が付加されます。

session.use_cookies

この設定はPHP5のデフォルト設定では有効になっています。つまりセッション管理はクッキーのみを用いて行われます。URLとフォームにセッションIDを埋め込むsession.use_trans_sid機能はセッションIDが漏洩する可能性が高いため,デフォルトでは無効に設定されています。

通常のPC向けWebサイトはデフォルト設定で困ることはほとんどないはずです。非オフィシャルな携帯サイトではsession.use_trans_sid=1に設定されたPHPでないと動作しないアプリケーションもあると思います。session.use_trans_sid=1設定は非常に危険なので不要に設定してはいけません。

session.hash_function

セッションIDを生成するハッシュ関数を選択できるようになりました。PHP4はMD5(128bit)のみでしたが,PHP5からSHA1(160bit)も選択できるようになりました。0でMD5,1でSHA1が利用されます。SHA1を利用することによりさらにコリージョン(セッションIDの衝突)の可能性を低下させることができます。SHA1に変更して問題がないアプリであればSHA1を利用するほうがよいでしょう。

session.hash_function = 1

session.entropy_fileとsession.entropy_length

UNIX系OSで/dev/urandomをサポートしているシステムでは,このデバイスを利用することによりセッションIDのランダム性を向上させることができます。

例:セッションIDのランダム性を向上させる設定

session.entropy_file=/dev/urandom
session.entropy_length=32

setcookie/setrawcookie

PHP5のセッションモジュールは,php.ini設定のsession.cookie_httponlyによりHttpOnly属性を付加したセッションIDクッキーを送信できるようになりました。任意のクッキーを設定する関数setcookie/setrawcookieにもこのオプションが追加されています。JavaScriptからアクセスする必要がない重要なクッキー,例えば自動ログインのキーとなるクッキーなどは,HttpOnly属性を付けるとクロスサイトスクリプティングのリスクを低減できます。

bool setcookie ( string $name [, string $value [, int $expire [, string $path [, string $domain [, bool $secure [, bool $httponly]]]]]] )
bool setrawcookie ( string $name [, string $value [, int $expire [, string $path [, string $domain [, bool $secure [, bool $httponly]]]]]] )

setrawcookieはPHP5から追加された関数です。クッキーの値が自動的にURLエンコードされないことを除けばsetcookieと同じ動作をします。

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書