DEVELOPERS BLOGデベロッパーズブログ

加藤 正人のデベロッパーズブログ

加藤 正人

氏名
加藤 正人
役職
多分SE
血液型
秘密
出没
美味しいもののあるところ
特色
タヒチ大好き。ちょいメタボ。

加藤 正人

2019/07/04

CSRF token mismatch

 

CakePHP 3.x で jQuery の ajax から POST したデータを処理しようとしたら、CSRF token mismatch. というエラーメッセージが表示されてデータを受け取れなかった。

色々調べてみたところ、

  • このメッセージは CakePHP 3 の CsrfProtectionMiddleware が表示している。
  • CakePHP 3.6 以降は CsrfProtectionMiddleware が既定値で「有効」になっている。
  • このため、Form ヘルパーを使わない form から送信されたデータをコントローラ側で処理しようとするとこのエラーが表示される。

という事が判明。ちなみに CSRF とは Cross Site Request Forgery の略で、サーバー宛にサーバーが意図しないリクエストを送信して処理させることによりサーバーからデータを入手する攻撃。この攻撃に対する防衛手段として、CakePHP 3.6 以降は CsrfProtectionMiddleware (CSRF プロテクションミドルウェア) を既定値で有効化することでフォームにワンタイムトークンを付与し、送られてきたリクエストが正当なトークンを持つかどうかでリクエストの正当性をチェックしている。

対処法としては、

  • ダミーのフォームを Form ヘルパーで作っておく。
  • そのフォーム内に隠しフィールドとして <input name="_csrfToken" type="hidden" value="..." /> が生成されているので、、その value 属性値を取得し ajax で POST する際に指定する。

となる。

やり方としては、まずビュー内に CakePHP の Form ヘルパーでフォームを形成しておく。

続いてそのフォームのスクリプトで

とすることで、CakePHP の付与した CSRF トークンを使って POST データを正しく送信できる。

関連タグ: CakePHP3  CSRF 

関連エントリー

名古屋オフィス 東京オフィス

お気軽にお電話ください 052-875-9930 年中無休にて対応しております

WEBからのお問い合わせ

サイト内検索

入力例:CSS、ポータルサイトなど