PHPのセッションファイルの保存場所変更についての覚書です。
セッションファイルの保存場所を変更するには、「session_save_path」関数を用いることができます。
http://www.php.net/manual/ja/function.session-save-path.php
たとえば、CORESERVERを利用していて、セッションファイルを自分のホームディレクトリである非公開領域(ルート直下にsessionディレクトリを任意に作成した場合)に置きたい場合には次のようにスクリプト内で設定します。
session_save_path('/virtual/your_account/session');
この関数実行を含むファイルを共通化して、セッションを要するファイルすべてにインクルードする訳です。(php.iniや.htaccess等でも同様の設定はできるみたいですが、それはおいときます。)
なお、session_start()関数を呼ぶ前に、session_save_path関数を実行することが必要です。
このように、通常のセッションの置き場(CORESERVERやXREAだと、’/tmp’)と違う場所にセッションファイルを置く様にした場合は、ガベージコレクションについても、設定しておきます。
ガベージコレクションを設定しておくと、セッションファイルの有効期間を任意に決められるので便利です。通常だと、1440秒(24分)アクセスがないとセッションは切れてしまいますが、それを、1時間とか2時間に延長することができます。
セッションの保存先変更とあわせて設定すると次のようなスクリプトになります。
//セッションファイル保存先 session_save_path('/virtual/account/session'); //ガベージコレクション設定 ini_set('session.gc_probability', 1); ini_set('session.gc_divisor', 100); ini_set('session.gc_maxlifetime', 2 * 60 * 60);
一番下の、’session.gc_maxlifetime’がセッションの有効期間を定めたものです。ここでは、2時間に設定しています。
上の二つは、これで一組です。この設定の場合、1/100の確率でセッションファイルを削除することを意味します。
1/100とは、session_start関数が100回呼ばれた場合、1回の確率でセッションファイルを削除する動作(ガベージ・コレクション)をするというものです。
こまめに削除したいなら、1/10にするのも良いかもしれませんし、セッションをなるべく長時間生かしたいなら1/1000とかにするのも良いでしょう。ちなみに初期設定は、1/100らしいです。
最後に蛇足ですが、セッションに関するセキュリティについても設定しておきます。
セッションをクッキーのみで処理する方がセキュリティが高まります。つまり、URLパラメーターにセッションIDを付けるのを止める方法です。これは次のように設定します。
//クッキーのみセッション可能設定
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
これで、URLパラメーターにセッションIDがついていても無視することになり、セッション固定化攻撃等を防ぐことができるというわけです。
ただし、クッキーが使えない携帯サイトでセッションを使う場合にはとりづらい方法かもしれません。
上記で、セッション関連の設定を解説しましたが、どれもsession_startよりも前に実行することを忘れずに。
なお、php.ini等で設定できる場合には、スクリプト内で設定するより楽なのでそちらの方がよいかもしれません。
もっとも、CORESERVERでは、php.iniをそれぞれのディレクトリに置く必要があるかもしれないので、共通ファイル化したスクリプト内に、ini_set関数で設定してしまうのもありかもです。
■ セッションファイルの保存先を変更する理由
最後の最後になりますが、どうしてセッションファイルの保存先を変更するのか?
セッションファイルは、通常は、ルート直下の’/tmp‘に作成されます。
これは、レンタルサーバーが共用サーバーである場合でも、同様です。
共用サーバーである場合、他のユーザーのセッションファイルもルート直下の’/tmp’に作成されます。
すると、自分のサイトに関連するセッションファイルと、他人のサイトのセッションファイルが同じtmpディレクトリに存在することになります。
セッションファイルの名前は、セッションIDと同じです。その結果、’/tmp’を覗かれた場合には、他人のセッションファイルのセッションIDを知ることができてしまいます。
これは、自分のセッションファイルのセッションIDが知られてしまうことも意味します。
セッションIDが漏洩するとなりすまされる危険があります。
そこで、自分だけのホームディレクトリかつ非公開領域にセッション用のディレクトリを作成しそこにセッションファイルを保存するようにするわけです。