[PHP-users 35509] Re: session_cache_expire 戻り値

shinichiro mori shinichiro.mori.1983 @ gmail.com
2011年 3月 4日 (金) 13:48:12 JST


森といいます。

少し時間が経ってますので、解決されたかもしれませんが、ちょっと考えてみましたので投稿します。

> sid=の値は同じなので、セッションは引き継がれていると思うのですが、SIDの
> 値が消えています。これはsession_cache_expireの問題ではなく、何か他に問題
> があるのでしょうか?

[1]
もし、SIDの値が消えているとしたら、

    Notice: Undefined index: sid in /path/to/file.php

のようなメッセージを確認できると思いますが、どうでしょうか。


[2]
session_set_cookie_params() 等を使用されてないとしたら、
おそらくブラウザのクッキーの有効期限は「ブラウザの終了時」にセットされると思います。

sid の値は同じという事なので、約1時間後に2ページ目を表示されるまで、
ブラウザを閉じる事はなかったのだと思います。

SID に代入されているのは、$_SESSION["sid"] ですが、これが空という事は、
サーバ側のセッションデータのファイルが、既に消去されていたのではないかと思います。

ところが、ブラウザにはセッションクッキーが残っており、リクエスト時に送信されるので、
サーバ側では、それをもとにセッションを初期化してしまいます。
「セッションアダプション」といわれる脆弱性の事だと思います。

すると、同じセッションIDで初期化はされるものの、ファイルは一旦消去されているので、
$_SESSION["sid"]は空になる、という状況が生まれると思います。

もし、上記のケースが当てはまるとしたら、

    session.gc_probability
    session.gc_divisor
    session.gc_maxlifetime

これらのガベージコレクションに関する設定が関係すると思うのですが、何か設定されてますでしょうか?

デフォルトで、それぞれ

    session.gc_probability = 1
    session.gc_divisor     = 100
    session.gc_maxlifetime = 1440

なので、session_start()が呼ばれる毎に、1%の確率でガベージコレクション処理が呼ばれ、
ファイルの mtime が 1440秒以上古いと消去されます。

約1時間後に2ページ目を表示されてますので、デフォルトのままであっても、たまたまファイルが
消去されたのかもしれません。


手元の環境で

    session.gc_probability = 100
    session.gc_divisor     = 100
    session.gc_maxlifetime = 30

で実験した所、30秒以上たってからの1回目のアクセスでは SID は残っており、
続けてアクセスすると、SID は消えました。
ガベージコレクションのタイミングが関係すると思います。

Ubuntu 10.04
apache 2.2.14
php 5.3.2


以上です。
いろいろ書いてしまいましたが、ガベージコレクションが関係するのではと思った次第です。
推測を多く含んでいますが、よろしくお願いします。
もし記述に間違いがあれば、指摘していただけたら助かります。


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