ブラウザを閉じてもセッションが切れないようにする、つまり寿命を伸ばす
【追記】2015年6月、より安全な記事を書いています
こちらの記事に新しい情報を載せています。
「【PHP】安全な自動ログイン機能というものを作ってみた」
↓以下の記事は古い情報となりますので、ご了承ください。↓
———-
僕の会社では製品の情報や新着のお知らせなどをデータベースで管理し、管理ページからフォームを介して入力や編集が行えるようにしている。
これは入力のフォーマットを一定にすることで社内の情報をなるべく統一し、管理しやすい状況に持っていく為。要はいろんな文言なんかがしちゃかちゃに書かれている状況が気持ち悪くてこのようなものを作った。ちなみに以前はサイト内に3ヶ所あるお知らせテーブルにHTMLで逐一書き込んでいた…(ヽ’ω`)
フォームからデータベース管理にすると入力も楽になるので非常によい。データも統一されるので精神衛生上も健康になれる。
今回は、この管理ページのセッションの寿命もちょっと伸ばしたからそれを書き留めておこうという話。正直会社の管理ページではあんまり…と思い実装しなかったのだけど、要望が多く、社内のPCは外部に触られないところにあるので実装した。XSSやCSRF対策は実装している。
今使っている管理ページのCMSは、これの7章8章を元に制作したものに改良を加えているもの。
技術評論社
売り上げランキング: 25,318
これには非常にお世話になった。
参考になったサイト・ページ
セッション有効期限を伸ばす
お世話になる設定たち
session_save_path session.gc_maxlifetime session.cookie_lifetime
このCMSではセッションを用いてログイン管理をしている。なのでセッションの寿命や確率をいじる。
ガベージコレクション
セッションはsession_start()
が行われた時に、1/100の確率で24分より古いセッションが削除される。なので、「24分より古いセッション」の部分を変えることでセッションの寿命を伸ばすことができる。
しかし、実はセッションはドメインを区別しないため、セッションの寿命を伸ばすだけでは、サーバー内の他のサイトの影響を受けてセッションが削除されてしまうらしい。ここで登場するのがこれ。
session_save_path
これでセッションの保存先を変えることができ、他のサイトに影響されずにセッションを管理できる。
具体的には、
session_save_path("/tmp");
とすることで、10日までは寿命を伸ばすことができる(10日でサーバーのcronがセッションを削除する)ちなみにここで書いている方法はphp_iniを操作するのではなく、PHPファイルに直接書き込んでいる。
セッションの寿命を伸ばす
ここはsession.gc_maxlifetime
で管理されてるらしい。デフォルトは1440(24分)なので、
ini_set('session.gc_maxlifetime', 86400);
とすると、セッションが1日生きることになる(60 * 60 * 24)
これで基本的にはオッケーなんだけど、ブラウザを閉じてもセッションが切れないようにしたい場合は、session.cookie_lifetime
に同じ値を入れることで生きるようになる(デフォルトは0)
これをsession_start()
より前に書く。
session_save_path("/tmp"); ini_set('session.gc_maxlifetime', 86400); ini_set('session.cookie_lifetime ', 86400); session_start();
これにより、「1/100の確率で1日より古いセッションが削除」という設定になる。らしい。
この確率を変えることも出来るんだけど、負荷をかけないためにこういう確率になっているのであまりいじらないほうがいいかなーと個人的に思う。
これでうちの管理ページではセッションが切れないようになった。
ともあれセキュリティの問題もあるので、有効期限に関してのご利用は計画的にしたほうがいいと思います。