web-dev-qa-db-ja.com

Cakephp3のajax呼び出しでCSRFトークンを定義する方法。また、一部のajaxリクエストでCSRFをオフにする方法

Cakephp3で、Csrfコンポーネントが有効になっている場合。 ajax呼び出しでどのように使用できますか。このbeforeSendでは、ajaxcsrfトークンのパラメーターがヘッダーに設定されています。 csrfTokenの値は何ですか。エラーが発生するので

csrfTokenが定義されていません

beforeSend: function(xhr){
    xhr.setRequestHeader('X-CSRF-Token', csrfToken);
},

また、一部のajax呼び出しでCsrfコンポーネントを無効にするにはどうすればよいですか。

7
ParminderBrar

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ミドルウェアを無効にする

も参照してください

5
ndm

すべてのフォームには非表示の__csrfToken_フィールドがあり、Csrfコンポーネントを有効にすると自動的に追加されます。これで、$('[name="_csrfToken"]').val()のようなjqueryによってこのフィールドのトークンを簡単に取得できます。

Ajax呼び出しは次のようになります。

_$.ajax({
   url: 'someUrl',
   headers : {
      'X-CSRF-Token': $('[name="_csrfToken"]').val()
   },
   type: 'post',
   ...
});
_
3
CodeWhisperer

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を無効にするか、任意のフィールドのロックを解除します。

0
Invincible