まずは、Security.levelについて

Security.level session.cookie_lifetime(セッションクッキーの有効期間) session.referer_check SESSION IS
high 0(ブラウザを閉じるまで) $_SERVER[“HTTP_HOST”]; リクエストごとに作成される
medium 7日間 $_SERVER[“HTTP_HOST”];
low 25年間 なし

session.cookie_lifetimeはセッションクッキーの有効期間なので、セッションタイムアウトは別に[core.php]の

/**
 * 'high'	Session timeout in 'Session.timeout' x 10
 * 'medium'	Session timeout in 'Session.timeout' x 100
 * 'low'		Session timeout in 'Session.timeout' x 300
 */
Configure::write('Session.timeout', '120');

で指定する。(Security.levelの設定によって変わる)

また、session.cookie_lifetimeの値はCakePHP 1.3 のもので、1.3.5だと

if ($this->security == 'high') {
	$this->cookieLifeTime = 0;
} else {
	$this->cookieLifeTime = Configure::read('Session.timeout') * (Security::inactiveMins() * 60);
}

Security::inactiveMins()は

function inactiveMins() {
	switch (Configure::read('Security.level')) {
		case 'high':
			return 10;
		break;
		case 'medium':
			return 100;
		break;
		case 'low':
		default:
			return 300;
			break;
	}
}

なので、Session.timeoutに依存する。(デフォルトは120m)

session.referer_checkとは

session.referer_check には、HTTP Referer に おいて確認を行う文字列を指定します。Refererがクライアントにより 送信されており、かつ、指定した文字列が見付からない場合、埋め込 まれたセッションIDは無効となります。デフォルトは空の文字列です。 

セッションハイジャックとかを防止するためには必要だと思う。

どうしたいか

  • ブラウザ閉じたらセッションは削除したい(自動ログインの機能は別途作成)
  • session.referer_checkできれば有効にする

ブラウザ閉じたらセッションは削除したい(自動ログインの機能は別途作成)

Security.level = ‘high’ だと リクエストごとにSESSION ID が作られるので、それだと携帯サイトの場合、都合が悪い、SESSION IDはそのままで、ブラウザ閉じたらセッションは削除したい。

/app/config/my_session.phpという設定ファイルを作成し、[core.php]に設定する。

Configure::write('Session.save', 'my_session');

my_session.phpは[cake_session.php]のcase ‘cake’:をコピーして

if (empty($_SESSION)) {
	if ($iniSet) {
		ini_set('session.use_trans_sid', 0);
		ini_set('url_rewriter.tags', '');
		ini_set('session.serialize_handler', 'php');
		ini_set('session.use_cookies', 1);
		ini_set('session.name', Configure::read('Session.cookie'));
		//ini_set('session.cookie_lifetime', $this->cookieLifeTime);
		ini_set('session.cookie_lifetime', 0); // 変更
		ini_set('session.cookie_path', $this->path);
		ini_set('session.auto_start', 0);
		ini_set('session.save_path', TMP . 'sessions');
	}
}

session.cookie_lifetimeを’0’にして、ブラウザが閉じたらセッションを削除するようにする。

session.referer_checkできれば有効にする

Security.level は ’high’ or ‘medium’ にする。
このチェックに引っ掛かるとセッションが消えてしまうので、WEBサービス何かと連携する時は’low’にした方が無難。
※proxyを使っててもリファラーチェックに引っ掛かる事が有った。

ただ、セッションが切れないように作り方を変えれば良い場合も有るので、なるべくそっちで対応した方が良い。

最後に

今回は
仮登録メール⇒メールに記載のURLクリック⇒(内部でリダイレクトして)プロフィールフォーム⇒登録完了
という機能を作成していて、開発時のメールサーバーはRadishを使っていたので、問題無かったが本番にリリースした際(yahooメール等)、セッションが切れて登録出来ないという不具合が起きてしまった。
その為、リダイレクトの必要は特に無かったので、リダイレクトをしないようにして事なきを得た。
しかし、本番でもテストはしていたのだが、リリースしたのが結構前だった為、この現象が起きたかどうか覚えていない。
※普通にURLをコピーしてアドレスバーに貼り付けてテストしたのかも・・・

色々ありましたが、勉強になりました。