CakePHP / Securityコンポーネント入れてはまったこと

昨日、はまったことがあったので、メモ。

【CakePHPのバージョン】
1.2.5

【こんなことが起きた】
・特定のプレフィクスのときだけ、basic認証をつけるようにしたい。
・そのために、Securityコンポーネントを、app_controller.phpに入れた。

   var $components = array( "Security" ) ;

・特定のプレフィクスのときだけbasic認証させるコードを、AppController::beforeFilter()に書いた

$this->Security->loginOptions = array('type'=>'basic','realm'=>'nyaaaa');
$this->Security->loginUsers =>array('hoge'=>'fuga');
$this->Security->requireLogin('*');

・よっしゃbasic認証できた!
・ところが、basic認証かけてない、ほかの一部ページが突然動かなくなった。
・動かなくなったページは、全部POSTで処理してる。GETで処理してるところは問題なく動いてる。
・いろいろ調べたら、POSTしてるときだけコントローラのアクション関数に飛んでない雰囲気がしている。

【原因】
Securityコンポーネントを入れるとデフォルトで POSTのvalidaition をやってくれます。
POST先でトークンのチェックをやってるので、CakePHPのformヘルパーを使わずにフォームのコードを書いてる場合、確実におかしくなります。
自前でやってるよとか気にする必要がないとかいう場合、validatePostをfalseにしちゃいます。

$this->Security->validatePost = false ;

これをやるとPOSTのトークンチェックを行わないので、当然のことながらCSRFに対して弱くなります
自分で対策してるからOK!とかいう場合を除き、この設定はしないほうがいいでしょう(まさに『素人にはおすすめできない』設定)。

参考:CakePHPでBasic認証対応ページを作る – blog.katsuma.tv

また、CSRFに関してはこちらがわかりやすい。
連載:[はまちちゃんのセキュリティ講座]ここがキミの脆弱なところ…!|gihyo.jp … 技術評論社

Comments are closed.