0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CakePHPのテンプレートで、Formヘルパーを使用せずにCSRFトークンを直接取得する方法

Last updated at Posted at 2023-02-27
<!-- csrfToken用の空のPOSTフォーム -->
<?= $this->Form->create(null, ['url' => '', 'type' => 'post']) ?>
<?= $this->Form->end() ?>
var token = $('input[name=_csrfToken]').val();

関わっているプロジェクトのソースコードを見ると、上記のような記述が多数ありました。Formヘルパーのcreate()メソッドが自動的にinput:hiddenの値として出力するCSRFトークンを取得するために、このように書いているようです。

Ajaxリクエストを行う際には必ずしもForm要素を必要としませんが、CSRFトークン文字列を出力するためだけにForm::create()を記述するのはあまりスマートとは言えません。

https://book.cakephp.org/3/ja/controllers/components/csrf.html
公式ドキュメントを読んでみました。

CsrfComponent はユーザーのブラウザーにクッキーを設定することで動作します。 フォームが Cake\View\Helper\FormHelper を用いて作成されている場合、 hidden フィールドに CSRF トークンが追加されます。 Controller.startup イベントの間、 もしリクエストが POST, PUT, DELETE, PATCH リクエストの場合は、 コンポーネントはリクエストデータとクッキーの値を比較します。

上記はドキュメント冒頭の記述ですが、ここにヒントが書いてあります。「クッキーを設定することで動作」とのことです。

var token = "<?= $this->request->getCookie('csrfToken') ?>";

これでOKです。

$token = $this->request->getParam('_csrfToken');

このようにも書いてますが、、、Requestオブジェクトが生成されるタイミングによるのでは?

もう少し公式ドキュメントが親切だといいな~と思います・・

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?