DEVELOPERS BLOGデベロッパーズブログ
- HOME >
- 加藤 正人のデベロッパーズブログ >
- CSRF token mismatch
加藤 正人のデベロッパーズブログ
- 氏名
- 加藤 正人
- 役職
- 多分SE
- 血液型
- 秘密
- 出没
- 美味しいもののあるところ
- 特色
- タヒチ大好き。ちょいメタボ。
- 2020/12/15
- CakePHP3 のリダイレクトがうまく行かない例
- 2020/11/12
- Apache Bench
- 2020/10/05
- PhpSpreadsheet でExcel ファイルを読み込む (CakePHP3)
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 データを正しく送信できる。
2020/12/15
2020/11/12
2020/10/05
2020/09/11
2020/08/03