CodeIgniterの学習 35 - DB2_Sessionの微改造をおこなってセッションIDの強制切り替え時間を5秒毎(任意の秒毎)にする
(08/11/10追記)
http://d.hatena.ne.jp/dix3/20081110/1226243974 にまとめました。
(08/11/09追記)
うーん、この改造は一時取りやめ、
取りあえず元に戻して保留する。
以前のエントリhttp://d.hatena.ne.jp/dix3/20080921/1221946495 で CodeIgniter Version 1.6.3上で
DB2_Sessionを利用して、セッションデータをDBに保持するようにする暫定版対応を施した。
現在の最新版、CodeIgniter Version 1.7.0上では、
CodeIgniter標準のSession.phpが改善されて、
ライブラリの拡張をしなくても同じようなことが出来るようになっているらしいが、
まだ俺の環境はバージョンアップをしていない。いずれ移行する予定だけど。
レスポンスヘッダのSet-Cookieがすごいことに
んで、DB2_Sessionを使っていて気になっていたんだが、
アクセスのある度(というかセッションデータが読み込まれる度)
に、セッションIDが切り替わりまくってしまう。
(DB側でupdateが複数回走り、それに伴いSet-Cookieが複数走っている。)
HTTPヘッダを見るとこんな感じになってやりすぎ感がある。だめじゃん。
http://xxxx/yyyy GET /yyyy HTTP/1.1 Host: xxxx User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://xxxx/yyyy Cookie: ci_session=c4cb3384eb09528c25074583be67e18e HTTP/1.x 200 OK Date: Thu, 06 Nov 2008 07:14:44 GMT Server: Apache Set-Cookie: ci_session=61312dead44a234cd3d333eab642eefb; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/ Set-Cookie: ci_session=b2d8cc655192f76ecdb37b835c48dfc8; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/ Set-Cookie: ci_session=d8d3436dd5b48aa6f770b455fecf8b45; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/ Set-Cookie: ci_session=740a60f00c34e637da1f09a55b87dd33; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/ Set-Cookie: ci_session=23b00b24d5eb50e7a79d5aa542c3ec5c; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/ Set-Cookie: ci_session=f553bcbda48c21190445e5e96bc4a727; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/ Set-Cookie: ci_session=a6c9f9b1e31aa191dbc32af28123c30f; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/ Set-Cookie: ci_session=8fe2b75c4532c97f62dd447dc0f74860; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/ Set-Cookie: ci_session=16953ae95c6783c3816379f74bbd0578; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/ Keep-Alive: timeout=15, max=99 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=UTF-8 Content-Language: ja ----------------------------------------------------------
(ホスト名とかはマスクしている)
仕方がないので、DB2_Sessionを改良する
CodeIgniter Version 1.7.0で更新された system/libraries/Session.php を見てみると、<?php //上略 function sess_update() { // We only update the session every five minutes by default if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now) { return; } //中略 } //下略 ?>
の様になっていて、セッションIDの強制切り替えは、
application/config/config.phpの
$config['sess_time_to_update'] = 300;
を見てくれるようになったみたいだ。
同様の対応を、DB2_Session改の、application/libraries/Db_session.php に対してもおこなうことにした。
application/libraries/Db_session.phpの改良
application/libraries/Db_session.php
<?php //上略 function sess_update() { // We only update the session every five minutes by default if (($this->userdata['last_activity'] + $this->time_to_update) >= $this->now) { return; } //中略 } //下略 ?>
を差し込んだ。変数名が微妙に異なるのは、ソースが違うから。
見ているモノは同じで、$config['sess_time_to_update']を見ている。
あと、
application/config/config.phpで、
$config['sess_time_to_update'] = 5;
にしてみた。(60秒とかでもいいと思うけど。)
動作確認
まずアクセスしてみる。
http://xxxx/yyyy GET /yyyy HTTP/1.1 Host: xxxx User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://xxxx/yyyy Cookie: ci_session=bc7c424f0eef21ae32c0a9422532851c If-Modified-Since: Thu, 06 Nov 2008 08:00:17 GMT HTTP/1.x 200 OK Date: Thu, 06 Nov 2008 08:00:27 GMT Server: Apache Set-Cookie: ci_session=cc75ce21fb590e841cd801386aa7b94c; expires=Thu, 06-Nov-2008 10:00:27 GMT; path=/ Expires: Thu, 01 Dec 1994 23:59:59 GMT Last-Modified: Thu, 06 Nov 2008 08:00:27 GMT Cache-Control: post-check=0, pre-check=0 Pragma: no-cache Keep-Alive: timeout=15, max=97 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=UTF-8 Content-Language: ja ----------------------------------------------------------
うむ、あほみたくSet-Cookieされなくなった。(DB側のセッションIDの強制更新も当然起きない。)
数秒後に接続してみる。
http://xxxx/yyyy GET /yyyy HTTP/1.1 Host: xxxx User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://xxxx/yyyy Cookie: ci_session=cc75ce21fb590e841cd801386aa7b94c If-Modified-Since: Thu, 06 Nov 2008 08:00:27 GMT HTTP/1.x 200 OK Date: Thu, 06 Nov 2008 08:00:45 GMT Server: Apache Set-Cookie: ci_session=90f04f1f989ddb0f668254339430278b; expires=Thu, 06-Nov-2008 10:00:45 GMT; path=/ Expires: Thu, 01 Dec 1994 23:59:59 GMT Last-Modified: Thu, 06 Nov 2008 08:00:45 GMT Cache-Control: post-check=0, pre-check=0 Pragma: no-cache Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=UTF-8 Content-Language: ja ----------------------------------------------------------
うむ、ちゃんと変わってくれた。
なんか、
Expires: Thu, 01 Dec 1994 23:59:59 GMT Last-Modified: Thu, 06 Nov 2008 08:00:27 GMT Cache-Control: post-check=0, pre-check=0 Pragma: no-cache
みたいなのが増えているんですけど、これなんすか?の理由は、
この作業中にHTTPレスポンスヘッダの調整を取りあえずしてみたから。
詳しくは明日のエントリで。つづく