[PHP-users 11972] Re: 「他人の情報を表示するサイト」

Kiyotaka Doumae php-users@php.gr.jp
Wed, 04 Dec 2002 18:42:12 +0900


どうまえです

In message "[PHP-users 11970] Re: 「他人の情報を表示するサイト」",
At Wed, 04 Dec 2002 17:59:31 +0900,
Rich Wrote.
> 田村様の記事をみてふと疑問に思ったのですが、PHPにおいて、アクセス過多な
> ど何かしらの原因で、直前に利用していたセッションIDと同じものが割り当てら
> れることはありうるのでしょうか?

PHP4 標準のセッションモジュールでは、

ext/session/session.c の
char *php_session_create_id(PS_CREATE_SID_ARGS) 関数

でセッションIDを生成していますね。

ここでは、MD5 digestの種として
sprintf(buf, "%ld%ld%0.8f", tv.tv_sec, tv.tv_usec, php_combined_lcg(TSRMLS_C
) * 10);
というように時刻(マイクロ秒単位)+乱数に依存して生成しているようです。

また、ここからさらに乱雑さを増すために、
http://www.php.net/manual/ja/ref.session.php
で書かれているように、
session.entropy_file
で指定されたファイルの内容 (マニュアルの推奨は /dev/(u)random)を使うことも
できるようです。(初期状態では使用しない)


乱数生成アルゴリズムのよしあしとかになると、私は手が出ないのでその部
分の評価はおいておきますが、時刻情報以外にも種を使っているのでまあ、
安全なんじゃないでしょうか?
この程度考えてあれば実用上問題ないのではないかと"私は"考えています。


> ありうるのであれば、それを回避するためにはどうしたらよいのでしょうか?

また、プラットフォーム依存になりますが、一般的なUNIX環境であればdigest
生成の種にプロセスIDを付加しておけばいいんじゃないでしょうか?
同一時刻にひとつのプロセスが処理できる相手はひとつだけですから。


セッションIDを自前で生成するようにしているばあいは、そのアルゴリズムに
依存するのでなんともいえません。


どうしても心配な場合、新規に生成したセッションIDが、すでに割り当て済み
でないかどうかをチェックするようなアルゴリズムを組み込めば確実ですね。


---
Kiyotaka Doumae
don@don.am / http://www.don.am/~don/