【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"の場合だけリファラの検査が行われないからです。
"high"、"medium"の場合、外部のサイトからリンクをたどるなどして
【/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;
}
アクセスすると、セッションIDが無効になってしまいます。
つまり、さらに別のページへ移動すると、セッションが消えてしまいます。
【障害の実例】
ユーザ登録で、フォーム画面で一旦仮登録し、記入されたアドレス宛にメールを送信し、そこに添えられたリンクをクリックすることで
登録が完了する、というシステム。
メールのリンクから飛んできて本登録するアクションを、下記のように
しました。
セキュリティが"low"以外の場合は、次の移動先の"login"ページに
function regist($keycode){
//キーコードの認証
//本登録として保存
$this->Session->setFlash('登録完了!');
$this->redirect('login');
}
セッション内容が渡されず、setFlashのメッセージが表示されません。
これが、別のページに飛ぶredirectではなく、アドレスはそのまま
変わらないrenderなら、setFlashも表示されるのですが…。
【結論】
というわけで、"Security.level"は"low"にしておくのが何かと便利だと思います。
いろいろネットで情報を漁ってみても、"high"はおろか"medium"に
してる人でさえ少ないような印象ですし。