今回は、ケータイ上からPHPのセッションを使う場合の設定方法についてです。
ケータイからPHPのセッションを機能を使う場合、端末によってはクッキーが利用できない場合があるため、そのままでは使うことができません。
セッションを使いたい場合は、インストール時のconfigureオプションに、「–enable-trans-sid」を付ける必要があります。
※Windowsの場合は特に設定の必要はありません。
また、「php.ini」の設定で、次のように設定してください。
※設定変更後はWebサーバの再起動が必要です
session.use_trans_sid = 1
もしくは「.htaccess」でも設定することができます。
※.htaccessでの設定上書きが許可されている場合のみ
php_flag session.use_trans_sid On
設定変更は、phpinfoで確認できます。
PHPのコード内で、
ini_set('session.use_trans_sid', '1');
でも設定できますが、その場合は「session_start();」より前に実行する必要があります。
設定が有効になると、リンクの後ろに自動でセッションIDが付加され、セッション変数が引き継げるようになります。
※ただしクッキーが使える端末で、「session.use_cookies On」の場合には、セッションの管理にはクッキーが優先して利用され、URLにセッションIDはつきません。
セッションIDが付加された例:
<a href="index.php?PHPSESSID=b37b5e8e31118c45e19a5fb6b70c215a"> トップへ </a>
ページの移動に静的HTMLを挟んだり、引数をつけないでリダイレクトしたりすると、セッションは切れてしまいますので注意が必要です。
※セッションハイジャックに対する注意書きが足りないとのご指摘を受けましたので追記しました。失礼しました。
上記設定のままですと、URLに固定のセッションキーがついたままの状態のため、リンク先のページにRefererが漏れてしまったり、友達へメールでURLを転送した場合などに、セッションハイジャックされてしまう可能性があります。
そこで安全度を高めるために、次のような対応策を平行して行うと良いようです。
※再度ご指摘を頂きました。iモードの端末はRefererを出力しないので、その場合はRefererを原因としたセッションハイジャックは考慮しなくてもよいようです。
- クッキーを利用できる端末の場合は、そちらを利用する
- 端末IDによる認証+IPアドレス制限を行う
- session_regenerate_id関数を利用する
1については、auとソフトバンクの最近の機種ではクッキーが利用できます。
クッキーが利用できれば、URLにセッションIDを付加しなくてすみますので、URLからの漏洩を防ぐことができます。
セッションの管理にクッキーを優先して利用するには、「php.ini」または「.htaccess」で、「session.use_cookies On」と設定されている必要があります。
2の「端末IDによる認証+IPアドレス制限」については、まず.htaccessなどで、携帯キャリアのIPアドレスからのみアクセス可能な状態にします。
その状態でセッションに端末IDを格納し、アクセスの度に認証チェックを行うことでなりすましを防ぎます。
IPアドレスの制限をかけるのは、Refererが漏れている場合は、端末IDも同時に漏れているケースが多いためです。
端末IDはリクエストを偽造することで、なりすまされる可能性があるため、携帯実機からのアクセスのみとすることで安全度を高めます。
3の「session_regenerate_id関数」は、アクセスの度にセッションIDを変更するためのものです。
PHPのバージョンによって対処法が異なりますので注意が必要です。
まずPHP5の場合は簡単です。
PHP5でのセッションID再生成のサンプル
session_start();
session_regenerate_id(true);
session_regenerate_idの引数にtrueをセットすることで、古いセッションIDは破棄され、毎回新しいIDがふられます。
PHP4ではこの引数が利用できないため、古いセッションは破棄されず、同じことを実現しようとすると少し大変です。
PHP4でのセッションID再生成のサンプル
// セッション開始
session_start();
// 古いセッションを保存
$sess_tmp = $_SESSION;
// セッション変数を破棄
session_destroy();
// セッションIDを再生成
session_start();
session_regenerate_id();
// セッションを元に戻す
$_SESSION = $sess_tmp;
参考にさせて頂いたのはこちら[php.gr.jp]のページです。
欠点としては、アクセスの度にセッションファイルが作成されるため、ゴミファイルが残りやすいという点があります。
アクセスが多いサイトの場合は、ガーベージ・コレクションの設定をより頻繁にしたり、こちら[phppro.jp]やこちら[ishinao.net]のやり方を参考にすると良いかも知れません。
なお、session_regenerate_id関数を使うと、毎回セッションIDが変わるため、通信エラーが起こった際にセッションが切れてしまう可能性があるようです。
利便性を重視するかセキュリティを重視するか、扱う情報の重要度に応じて使い分けると良いと思います。
(詳しくはコメント欄をご参照ください)
※追記分について、まだセキュリティ上問題があったり、何か他に良い方法がありましたら、ご指摘をお願いします