私は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);
}
});
_
何が欠けていますか?または私が間違ったいくつかの構成?
最新の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
},
// ...
});
こちらもご覧ください
このコードを$ .ajax()関数呼び出しに追加します。
beforeSend: function (xhr) { // Add this line
xhr.setRequestHeader('X-CSRF-Token', $('[name="_csrfToken"]').val());
}, // Add this line
CakePHP 3.8の場合、これでうまくいきました。 config\routes.phpに次のようにコメントします。
//$routes->applyMiddleware('csrf');
ajaxを使用せずに同じエラーが発生しました。問題は、管理テーマがcakephp 3フォームヘルパー構文を使用しておらず、htmlであったことです。
form-> create()?> Form-> end()?>で変更した後、うまくいきました