[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 メーリングリストの案内