Home > CakePHP | PHP > CakePHPでCSRF対策

CakePHPでCSRF対策

この記事の所要時間: 33

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&#91;_Token&#93;&#91;key&#93;" 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投げておきます。

Pocket

follow us in feedly

コメント (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
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対策 […]

pingback from お問い合わせフォーム等のメールフォームのスパム対策 | Binbo-Special – WEB制作や運営に関する楽屋話 - 13-04-22 (月) 11:52

[…] CakePHPでCSRF対策 – Shin x blog […]

Home > CakePHP | PHP > CakePHPでCSRF対策

検索
フィード
メタ情報

Return to page top