ざきのメモ

2018/09/01

CakePHP3 で入力フォームを作ったら CSRF token mismatch といわれた

CakePHP3 で入力フォームを作ったら CSRF token mismatch といわれたので原因と対処法を残しておきます。

環境

  • CakePHP 3.6.10

原因

CSRF token mismatch とエラーがはかれる原因は、CSRF 攻撃からの保護機能が有効になっているためです。

このエラーは CakePHP の FormHelper という機能をつかって入力フォームを作ることで回避できます。

また、危険ですが保護機能を無効にすることでも回避することができます。

以上の二つの対処法を以下で説明します。

対処法1 - FormHelper を使う

前提として以下の状態を想定します。

  • Controller -> Hello
  • Action -> index

例えば以下のような入力フォームをつくりたいとします。

<form method="post" action="/hello/index">
  <input type="text" name="msg">
  <input type="submit">
</form>

上のような入力フォームを FormHelper を使ってつくるためには以下のようにかきます。

<?=$this->Form->create(null, ['url' => ['controller' => 'Hello', 'action' => 'index'], 'type' => 'post'])?>
<?=$this->Form->input('msg');?>
<?=$this->Form->submit('送信')?>
<?=$this->Form->end()?>

null と書いているところはモデル名を指定するところです。

とりあえず null としていますが、実際に使う場合はモデル名を指定したほうが便利です。

POST ではなく、GET にしたい場合は type の post と書かれているところを get に書き換えて下さい。

対処法2 - 保護機能を無効にする

この方法はおすすめできませんが、一応書いておきます。

src/Application.php 内にある以下の部分をコメントアウトすることで CSRF 攻撃からの保護機能を無効化できます。

// Add csrf middleware.
->add(new CsrfProtectionMiddleware([
  'httpOnly' => false
]));

ここを丸ごとコメントアウトすると末尾のセミコロンも消されるため、適宜セミコロンを追記してください。

参考

Copyright © 2017-2021 Ryo Okazaki, all rights reserved.