CakePHPでCSRF対策を行う方法です。
フレームワークに含まれているSecurityコンポーネントを使います。
Security#requestAuth()にアクションを記述しておくと、アクション実行前に正規リクエストかどうかをチェックします。チェックの方法はCSRF対策で一般的なワンタイムトークン方式です。
まずController#beforeFilter()にてチェックを行うアクションを指定します。
[app/controller/test_controller.php]
< ?php class TestController extends AppController { var $name = 'Test'; var $components = array('Security'); function beforeFilter() { $this->Security->requireAuth('add', 'edit'); } function add() { // } function edit() { // } } ?>
あとはビューファイルにトークンを埋め込みます。ポイントはformタグをHTMLで書かずにHtmlHelper#formTag()で記述するという事です。そうしておけばフレームワークがトークンをhiddenで埋め込んでくれます。(もとからformTag()で記述されている場合はそのままで良いです。)
[app/views/test/add.thtml]
< ?php echo $html->formTag() ?>
実行時のHTMLソースは以下のような感じになります。(トークンの値は表示毎に変化します。)
<form action="/test/add/" method="post"> <input type="hidden" name="data[_Token][key]" value="cfa714174ecc102178c6c540b04fa94dc0d5bd5d" id="_TokenKey" /> </form>
トークンが一致しないリクエストが発生した場合は[HTTP/1.0 404 Not Found]が出力されます。(この動作は変更できます。)
上記は一つのコントローラでチェックを行っていますが、全てのフォームで同様のチェックを行うならSecurity#requestAuth()をAppController#beforeFileter()に書いておけばokです。
[app/app_controller.php]
< ?php class AppController extends Controller { var $components = array('Security'); 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するなら後者ですね。
エントリも修正しておきました。ありがとうございました。:-)
トラックバック:2
- このエントリーのトラックバックURL
- /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対策 […]
- pingback from お問い合わせフォーム等のメールフォームのスパム対策 | Binbo-Special – WEB制作や運営に関する楽屋話 - 13-04-22 (月) 11:52
-
[…] CakePHPでCSRF対策 – Shin x blog […]