CakePHPでCSRF対策を行う方法です。
フレームワークに含まれているSecurityコンポーネントを使います。
Security#requestAuth()にアクションを記述しておくと、アクション実行前に正規リクエストかどうかをチェックします。チェックの方法はCSRF対策で一般的なワンタイムトークン方式です。
まずController#beforeFilter()にてチェックを行うアクションを指定します。
[app/controller/test_controller.php]
-
<?php
-
class TestController extends AppController {
-
var $name = 'Test';
-
-
function beforeFilter() {
-
$this->Security->requireAuth('add', 'edit');
-
}
-
-
function add() {
-
//
-
}
-
-
function edit() {
-
//
-
}
-
}
-
?>
あとはビューファイルにトークンを埋め込みます。ポイントはformタグをHTMLで書かずにHtmlHelper#formTag()で記述するという事です。そうしておけばフレームワークがトークンをhiddenで埋め込んでくれます。(もとからformTag()で記述されている場合はそのままで良いです。)
[app/views/test/add.thtml]
実行時のHTMLソースは以下のような感じになります。(トークンの値は表示毎に変化します。)
トークンが一致しないリクエストが発生した場合は[HTTP/1.0 404 Not Found]が出力されます。(この動作は変更できます。)
上記は一つのコントローラでチェックを行っていますが、全てのフォームで同様のチェックを行うならSecurity#requestAuth()をAppController#beforeFileter()に書いておけばokです。
[app/app_controller.php]
-
<?php
-
class AppController extends Controller {
-
-
function beforeFilter() {
-
$this->Security->requireAuth('add', 'edit');
-
}
-
}
-
?>
こうしておけば全てのControllerでadd/editアクションを実行する前にチェックがかかります。
ワンタイムトークン方式ではコントローラ/モデル側とビュー側の双方に記述が必要なのですが、フレームワーク側で考慮されているので手軽に使用できます。
ただ残念ながらbakeで生成したビューファイルはformタグがHTMLで書かれており、いちいち上記のように書き換える必要があります。HtmlHelperはデフォルトで読み込まれるのでformTag()で書いておいてくれれば楽なのですが。
# 気が向いたらTicket投げておきます。
- Newer: Binary 2.0カンファレンス2006
- Older: mail関数のログを取る
コメント (Close):2
- shun 06-12-21 (木) 11:04
-
今、ためしてみたんですが、$html->formTag($html->url('/test/add/'.$html->tagValue('test/id')) というのは、単に $html->formTag() とするか、 $html->formTag('/test/add/'.$html->tagValue('test/id')) としたほうがよさそうですね。formTag() の中でも url() を呼んでるみたいです。どうでしょうか?
- shin@1x1 06-12-21 (木) 12:28
-
ですね。冗長な表現でした。
表示ページ自身にsubmitするなら前者、違うページにsubmitするなら後者ですね。
エントリも修正しておきました。ありがとうございました。:-)
トラックバック:1
- このエントリーのトラックバックURL
- http://www.1x1.jp/blog/2006/12/cakephp_csrf.html/trackback
- Listed below are links to weblogs that reference
- CakePHPでCSRF対策 from Shin x blog
- pingback from 【CakePHP】CSRF対策でSecurityComponentを使う場合の注意点 | ねねとまつの小部屋 08-01-25 (金) 20:32
-
[...] Shin x blogさんCakePHPでCSRF対策 [...]
