携帯サイトでセッションを使いたい場合は、Cookieを使えないdocomo端末のためにセッションIDをurlに含めて処理する必要がある。
その処理をCakePHPで行うためのメモ。

使ったのは CakePHP 1.2.0.7692-rc3 で。
あと今回は「携帯専用サイト」の例ですので、PC・携帯両対応サイトの場合はもうちょっと考慮する必要があると思います(Cookieとの使い分けとか)。

app/config/core.php の変更

Configure::write('Session.save', 'cake');
Configure::write('Security.level', 'medium');
今回はCakeのセッションコンポーネントを使うようにする。
そのときに Security.level が 'high' だと、ページの再読み込みや前のページに戻るだけでセッションが破棄されてしまうので、それを防ぐために 'medium' に変更する。
それらを考慮しなくていい場合は 'high' でも一応動作するのは確認している。

このままだとurlに "CAKEPHP=xxxxxx..." というセッションidが追加されるが、CAKEPHPという文字列を変えたい場合は Session.cookie の値を変更する。

cake/lib/session.php の変更

function __initSession() {

...

switch(Configure::read('Session.save')) {
  case 'cake':
    if (!isset($_SESSION)) {
      if ($ini_set) {
//      ini_set('session.use_trans_sid', 0);
        ini_set('session.use_trans_sid', 1);
//      ini_set('url_rewriter.tags', '');
        ini_set('session.serialize_handler', 'php');
//      ini_set('session.use_cookies', 1);
        ini_set('session.use_cookies', 0);
        ini_set('session.name', Configure::read('Session.cookie'));
        ini_set('session.cookie_lifetime', $this->cookieLifeTime);
        ini_set('session.cookie_path', $this->path);
        ini_set('session.auto_start', 0);
        ini_set('session.save_path', TMP . 'sessions');
      }
    }
  break;

...
まずはセッションIDをurlへ含めるために use_trans_id を 1 に変更。
そして url_rewriter.tags をコメントアウト(これをしないと uid を付加してくれない)。
最後に use_cookies を 0 にして Cookie を使わないようにすれば良い。

これで url にセッションIDを引き回してくれるようになる。
CakePHPはSessionコンポーネントを自動的に開始してくれるので、コントローラで特に特別な処理をすることなく
$this->Session->save('hoge', 'fuga')
とか書く事が可能。


もちろんこれらの内容はセッションIDを引き回せるようにしただけなので、セッションハイジャックなどのセキュリティ対策を別途行わなくてはならない。

にほんブログ村 IT技術ブログ プログラム・プログラマへ