[PHP-users 698] Re: セッションID を生成する仕組みについて

Yasuo Ohgaki php-users@php.gr.jp
Fri, 13 Jul 2001 11:51:07 +0900


大垣です。

> >  PHP4 のセッション ID は REMOTE_ADDR や REMOTE_PORT とは関係なく
> >生成されます。
> >   有限な数の集合である以上、完璧にユニークであるとは言い切れない
> >と思いますが、事実上ユニークと考えても差し支えないでしょう。
>
> 事実上ユニークであるということには賛成です。

勉強したのが大昔なのでよく覚えていない+意見の分かれるところですが、たしか、統計
上100万分の一以下の場合はほぼ0と考えてよい、と言うことだったと記憶しています。
# 間違っていたら教えてください!!

PHPのセッションIDの生成でコリージョンが起きる確立は100万分の1より遥かに低いと思
います。単純計算では(有効なセッションIDの数)/(36^32)になりますから。

> ただ、自分が第三者に組んだプログラムに関する説明を行う際に、
>
> 1セッションIDの発行を関数に任せている
> 2セッションIDの発行にはキーが不要
> 3しかし、その関数がどのような仕組みでセッションIDを発行しているかが
>  分からない
> 4したがって、そのセッションIDが本当にユニークなものであるかが
>  証明できない。あるいは、第三者によって生成することが不可能である
>  ということが証明できない。

セッションIDの性質上、他の情報を使わずに、コリージョンの可能性を論理上0にするの
は無理ではないでしょうか?私はコリージョンの確立が0である必要は無いと考えていま
す。

> ということでつまづいています。
> 乱数を使っている場合は、二つのコンピュータが
> 1同じタイミング
> 2同じ条件
> で乱数を発行した場合は同じ値になる可能性があります。
> もし、セッションIDの発行が単純な乱数によるものであれば、
> 第三者によって生成することも不可能ではないということに
> なってしまわないでしょうか?

session.cのコード、MD5のアルゴリズム、/dev/urandom(/dev/random)の仕組み上、現
実的には無理でしょう。私はコリージョンの可能性を気にしていません。コリージョンよ
りセッションハイジャックの方が現実的な脅威では無いでしょうか?

> 神経質な質問で申し訳ないのですが、PHP4が、セッションIDを発行する
> 仕組みをご存知でしたら教えていただきたく思います。

session.cの_php_create_id()あたりでセッションIDは作られていると思います。

# 例えば、WindowsNTには固有のシステムIDが必要で、固有のIDはインストール中に
# そのコンピュータの中で生成されます。その点、セッションIDと似ていると言えると
# 思います。結構、こういった仕組みでユニークIDを生成しているシステムは多いと
# と思うのですが、、、、

キャッシュサーバーの存在を考慮するとインターネットでの利用はお勧めできませんが、
カスタムセッションハンドラーを作成してREMOTE_ADDRとセッションIDが一致することを
強制することも出来ます。(REMOTE_ADDRはキャッシュサーバーの設定によっては、変わ
ることがあります。詳細はX-FORWARDED-FORをキーワードにして検索して見てくださ
い。)

--
Ohgaki, Yasuo (大垣 靖男) 
Mail: yohgaki@dd.iij4u.or.jp