【CakePHP】Security.levelはlowにすべき


(追記: 2012-07-24)
CakePHP 2.2.1では、セッションが消える恐れのあるコードは発見されませんでした。
他に気になる点がなければ、Security.levelは'high'や'medium'でも問題ないと思います。


【おすすめ設定】

【/app/config/core.php
Configure::write('Security.level', 'low');


【理由】
下記のように、"low"の場合だけリファラの検査が
行われないからです。

【/cake/libs/cake_session.php
switch ($this->security) {
case 'high':
$this->cookieLifeTime = Configure::read('Session.timeout') * Security::inactiveMins();
if ($iniSet) {
ini_set('session.referer_check', $this->host);
}
break;
case 'medium':
$this->cookieLifeTime = Configure::read('Session.timeout') * Security::inactiveMins();
if ($iniSet) {
ini_set('session.referer_check', $this->host);
}
break;
case 'low':
default:
$this->cookieLifeTime = Configure::read('Session.timeout') * Security::inactiveMins();
break;
}
"high"、"medium"の場合、外部のサイトからリンクをたどるなどして
アクセスすると、セッションIDが無効になってしまいます。
つまり、さらに別のページへ移動すると、セッションが消えてしまいます。


【障害の実例】
ユーザ登録で、フォーム画面で一旦仮登録し、記入されたアドレス宛に
メールを送信し、そこに添えられたリンクをクリックすることで
登録が完了する、というシステム。


メールのリンクから飛んできて本登録するアクションを、下記のように
しました。


function regist($keycode){
//キーコードの認証
//本登録として保存
$this->Session->setFlash('登録完了!');
$this->redirect('login');
}
セキュリティが"low"以外の場合は、次の移動先の"login"ページに
セッション内容が渡されず、setFlashのメッセージが表示されません。
これが、別のページに飛ぶredirectではなく、アドレスはそのまま
変わらないrenderなら、setFlashも表示されるのですが…。


【結論】
というわけで、"Security.level"は"low"にしておくのが何かと
便利だと思います。
いろいろネットで情報を漁ってみても、"high"はおろか"medium"に
してる人でさえ少ないような印象ですし。