2011年3月 4日

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

森といいます。

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

> 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 mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3


投稿者 xml-rpc : 2011年3月 4日 13:48
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/102405
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。