PHP/patch/StrictSession

Last-modified: 2009-09-30 (水) 17:59:14 (337d)
Top / PHP / patch / StrictSession

PHP/patch

StrictSession

PHPのセッション管理はパーミッシブなセッションID管理をしています。パーミッシブなセッションID管理とは、存在しないセッションIDが送信された場合、送信されたセッションIDでセッションを初期化します。つまり、PHPのセッションID管理はSession Fixation(セッションの固定化)攻撃に脆弱です。

http://www.suspekt.org/session_strict_mode.patch

はストリクト(厳格)なセッションID管理を行うパッチですが、SQLiteのセーブハンドラ用のパッチがありません。このページに添付してあるパッチは上記のパッチにSQLite用のセーブハンドラコードを追加したパッチです。

このパッチを適用すると

  • URLに「PHPSESSID=124356789」等を記述してもセッションIDを固定化が不可
  • session.use_only_cookies=offでもURLにセッションIDが記載されていても安全
  • trans_sidの安全性がかなり向上します。(ただしセッションIDの漏洩は可能)
  • cookie値の設定によるセッションの固定化にも対応

ただし

  • セッションIDにはa-z, A-Z, 0-9, および "-"(ハイフン),","(カンマ)のみ利用可能

になります。

php.iniに

  • session.use_strict_mode = 1 (1: 有効、0:無効)

を追加すると厳格なセッションID管理が可能になります。

  • session_set_save_handler関数は2つの関数を受け付けるようになります。(オプション)
    • string create_sid()
    • bool validate_sid($key)

注意:ほとんど無いとは思いますが、もしアプリケーションがセッションの固定化が可能な仕様を利用していると動作しなくなる場合があります。

備考:このパッチを使わない場合はログイン後などにsession_regenerate_id()を使用してセッションIDを新しく発行すれば多くの脆弱性を回避できます。

パッチ

枡形さんのPHP4用のパッチ。
http://d.hatena.ne.jp/masugata/20080714#p2