[PHP-users 25519] Re: session_regenerate_id が古いセッションファイルを消さない件

Yasuo Ohgaki yohgaki @ ohgaki.net
2005年 4月 30日 (土) 06:43:54 JST


大垣です。

haward wrote:
> セッションハイジャック対策に、session_regenerate_idなどを
> 使ってときどきセッションIDを変えようという作戦は多いと思います。
> 
> しかし、この関数、古いセッションファイルを消してくれないようです。
> それじゃセッションハイジャック対策にならないような・・・!?
> 
> バグリポートを見たところ、次のような議論になってまして、
> http://bugs.php.net/bug.php?id=32064
> つまり、
> 「session_regenerate_id()しても古いセッションファイルが残るのは何でだ?」
> 「なんでそんな必要があるんだ?バグじゃない。仕様だ」
> のような話になっているのですが、
> どーも納得いきません。
> 
> どう思われます?>みなさま

確かにこの動作には問題があると思います。

session_regenerate_idを利用する背景からすると、少なくとも同時に古いセッ
ション情報を消すオプションがあった方がよいですね。長い有効期限のセッショ
ンを作成しても正規ユーザと思われるユーザからのアクセスがあった場合、メー
ル等でセッションIDを含む情報を送ってしまった場合、などに問題を少なくする
為に作られた関数ですから「ガーベッジコレクションで削除されるでしょ?」と言
うコメントはセキュリティ上の問題を考慮していないと思われます。

session_regenerate_id([bool delete_old_session_info])

の様に古いセッションファイルを削除するオプションを作るには
session.cのPHP_FUNCTION(session_regenerate_id)の中でphp_session_destory()
を呼べば良いだけかな?と思いソースを見てみました。基本的には、PS(id)を保存
して、php_session_destory()で実行している手順を保存したPS(id)に対して
行えばよいのですが、セッションモジュールの関数はモジュールグローバル変数
に対して処理を行うようになっています。このため、あまり綺麗なコードになら
ないですね...

# 綺麗に書くにはもうちょっと考えてみる必要がありそうです。
# このオプションは作りたいですね。オプションより問答無用で
# 消した方がセキュリティ上好ましいですが...

# CVS headのfilesセーブハンドラはdestoryでunlinkしてますが
# linux/php5.0.4はunlinkできてないですね。TSRMがおかしいの
# かな、とも思いましたがZTS無しの場合はただのunlinkですしね...
# XFS等を使っていればsessionファイルが数十万ファイルくらいあっ
# ても性能はほとんど落ちないのであまり困りはしませんが。

--
Yasuo Ohgaki
http://blog.ohgaki.net/


PHP-users メーリングリストの案内