Cakephp3で、Csrfコンポーネントが有効になっている場合。 ajax呼び出しでどのように使用できますか。このbeforeSend
では、ajaxcsrfトークンのパラメーターがヘッダーに設定されています。 csrfToken
の値は何ですか。エラーが発生するので
csrfTokenが定義されていません
beforeSend: function(xhr){
xhr.setRequestHeader('X-CSRF-Token', csrfToken);
},
また、一部のajax呼び出しでCsrfコンポーネントを無効にするにはどうすればよいですか。
CSRFコンポーネントは、現在のトークンを__csrfToken
_としてリクエストパラメーターに書き込みます。リクエストオブジェクトのparam()
メソッド(またはCakePHP3.4ではgetParam()
)を介して取得できます。
_setRequestHeader('X-CSRF-Token', <?= json_encode($this->request->param('_csrfToken')); ?>);
_
CSRFコンポーネントは、コントローラーのイベントマネージャーから削除することで無効にできます。たとえば、次のような特定のアクションの場合、これを行うために必要な条件を把握する必要があります。
_public function beforeFilter(\Cake\Event\Event $event)
{
parent::beforeFilter($event);
if ($this->request->param('action') === 'actionXyz') {
$this->eventManager()->off($this->Csrf);
}
}
_
CSRFミドルウェアを使用している場合、トークンは__csrfToken
_という名前のリクエストパラメーターとして引き続き使用できますが、ミドルウェアを無効にすると動作が異なります。たとえば、Cakephp 3.5.6コントローラーのCSRFミドルウェアを無効にする
も参照してください
すべてのフォームには非表示の__csrfToken
_フィールドがあり、Csrfコンポーネントを有効にすると自動的に追加されます。これで、$('[name="_csrfToken"]').val()
のようなjqueryによってこのフィールドのトークンを簡単に取得できます。
Ajax呼び出しは次のようになります。
_$.ajax({
url: 'someUrl',
headers : {
'X-CSRF-Token': $('[name="_csrfToken"]').val()
},
type: 'post',
...
});
_
CakePHP
特定のアクションに対して、フィールドのロックを解除したり、CSRFセキュリティコンポーネントを無効にしたりしないでください。これはフォームのセキュリティにとって重要です。
"リクエストはブラックホール化されました。"、 "フォーム改ざんエラー"、 "その場所へのアクセスは許可されていません。"または "POST data"の予期しないフィールド。これは主に、CSRFコンポーネントが期待どおりに機能しているためです。
それを無効にしたり変更したりすることは解決策ではありません。無効にする代わりに、正しいアプローチに従ってください。上記の場合、フォームをシリアル化してみてください。そうすれば魔法のようになります。
var el = $("#xyzForm");
var ajaxTPCalls = el.serializeArray();
$.ajax({
type: el.attr('method'),
async: true,
url: el.attr('action'),
data: ajaxTPCalls,
dataType: "json",
cache: false,
success: function (data) {
toastr.success(data.message, data.title);
},
error: function (jqXHR) {
if (jqXHR.status == 403) {
$("body").html(jqXHR.responseText);
}
}
});
このようにして、しないでください CSRFを無効にするか、任意のフィールドのロックを解除します。