web-dev-qa-db-ja.com

3.6バージョンでのリクエスト後のCSRFトークンの不一致

私はcakephpの2つの異なるアプリを持っています。 1つはバージョン3.5、もう1つは3.6です。

3.5アプリを使用してビルドしたとき、_CSRF matching in post request._の問題はありませんでしたが、3.6を使用しているため、CSRFトークンのエラーが発生します。

どちらのアプリのAppControllerでも、CSRFコンポーネントは無効になっています。

//$this->loadComponent('Csrf');

私はこのような単純な投稿リクエストを使用しています:

_$.ajax({
        type: "POST",
        url: "../user/my_action",
        dataType: 'json',
        success: function (data) {
            set_data(data.response);
        }
    });
_

何が欠けていますか?または私が間違ったいくつかの構成?

4
fat potato

最新の3.6アプリケーションテンプレートは、デフォルトでCSRFミドルウェアを使用するようになりました。アプリを確認してくださいsrc/Application.phpファイル。残念ながら、この変更は適切に文書化されておらず、人々を驚かせました。

理想的には無効にせず、代わりに適切なCSRFトークンをAJAXリクエストと共に渡すと、ビューテンプレートのリクエストオブジェクトから、たとえばレイアウトで簡単にトークンを取得できます。グローバルに利用できるようにする:

<script>
var csrfToken = <?= json_encode($this->request->getParam('_csrfToken')) ?>;
// ...
</script>

その後、AJAXリクエストで簡単に使用できます。

$.ajax({
    headers: {
        'X-CSRF-Token': csrfToken
    },
    // ...
});

こちらもご覧ください

19
ndm

このコードを$ .ajax()関数呼び出しに追加します。

beforeSend: function (xhr) { // Add this line
        xhr.setRequestHeader('X-CSRF-Token', $('[name="_csrfToken"]').val());
 },  // Add this line
4
SnguyenOne

CakePHP 3.8の場合、これでうまくいきました。 config\routes.phpに次のようにコメントします。

//$routes->applyMiddleware('csrf');
2
levolutionniste

ajaxを使用せずに同じエラーが発生しました。問題は、管理テーマがcakephp 3フォームヘルパー構文を使用しておらず、htmlであったことです。

form-> create()?> Form-> end()?>で変更した後、うまくいきました

1