セッションID生成器を差し替える

php_session_hash-0.0.1devel.tgz
セッションハンドラのセッションIDを生成する関数を差し替える拡張モジュールを書いてみました。


PHP4 でも PHP5 にある session.hash_function, session.hash_bits_per_character 相当の設定ができるほか、hash (または mhash) エクステンションと連携して、より安全?な重複の可能性が低いセッションIDを生成することもできます。


インストールは通常の PHP エクステンション同様ですが、hash エクステンションを使ってセッション ID を生成する場合は ./configure --with-session-hash=hash とします。
このとき、拡張モジュールのヘッダが PHP の includedir (/usr/local/include/php 等) にインストールされていないと make できません。エラーが出た場合、作業ディレクトリで mkdir -p ext/hash した後、ext/hash に hash エクステンションのソースコードから php_hash.h をコピーすれば make できるはずです。
mhash の場合は上記の hash を mhash に読み替えてください。また、mutils/mhash.h があるディレクトリを CPPFLAGS で指定する必要があるかもしれません。


使い方は、session_hash エクステンションを有効にして、session_module_name($name) および session_set_save_handler() より後 (省略可)、かつ session_start() または session_regenerate_id() より前に session_hash_set_algorithm($algo, $bpc) するだけです。
$algo は 'md5', 'sha1', あるいは hash/mhash でサポートされているハッシュ関数、$bpc は 4, 5, 6 のいずれかを指定します。


追記:
「重複の可能性が低い」セッションIDを生成できますが、重複を完全に防げるわけではありません。別途チェックが必要です。
セッションID生成時に重複をチェックするコールバック関数を指定できるように拙作の session_hash エクステンションを改良することも考えています。
また、セッションハイジャックおよびセッション固定化を防ぐには php.ini で session.use_only_cookies = 1 にする、ログイン処理前に session_regenerate_id() (PHP5 なら session_regenerate_id(true)) する等の対策を組み合わせる必要があります。