0

AJAX を使用してユーザー フォームを送信し、AJAX を介したデータ送信を必要とする他のユーザー操作を処理するサイトで、Codeigniter の CSRF 保護を有効にしました。その結果、「アクションは許可されていません」というサーバー側のエラーに遭遇しました。JavaScript が収集して AJAX 経由で送信したデータのみがサーバーに渡され、その結果、CSRF コードが送信されていないことがすぐにわかりました。

生成されたトークン タグは次のようになります。

<input type="hidden" name="csrf_test_name" value="dsflkabsdf888ads888XXXXXX" />

したがって、検証のためにトークンをサーバーに送信する最も簡単な方法は、 csrf_test_name で jQuery セレクターを使用して値を取得し、これをサーバーの投稿データに追加して検証することです。以下のコードに従って:

//get CSRF token
var csrf = $('[name="csrf_test_name"]').val();

//build the form data array
var form_data = {
    csrf_test_name: csrf,
     ... ... ...
     ... ... ...
}

//send the form data to the server so it can be stored
$.ajax({
    type: "POST",
    data: form_data,
    url: ...,
    dataType: "html",
    success: function(msg){
         ... ... ...
    }//end success
});//end ajax

サーバーにデータを送信する ajax 送信ごとにこの手順に従いましたが、サーバー側のエラーは修正され、すべて正常に動作します。

これをテストするために、間違った CSRF トークンをハードコーディングしました。サーバーは矛盾を検出し、エラー コード 500 を返すため、表面上はこれが機能します。

私の質問はこれです。これはこれを行う安全な方法であり、従うべきベストプラクティスはありますか? 私はこれについていくつかのグーグル検索を行いましたが、他のすべての方法はより複雑であるように思われます.

4

2 に答える 2

2

Ajax セットアップに追加するのが好きです。一度設定すると、すべてのリクエストの投稿データに自動的に追加されます。

$.ajaxSetup({
    data: {
        csrf_test_name: $("input[name='csrf_test_name']").val()
    }
});
于 2013-06-10T18:47:20.410 に答える
1

簡単な方法は、その csrf を$.ajaxSetup()その方法で渡し、後でリクエストに含めること$.ajax()です。

var csrf = $('input[name="csrf_test_name"]').val();
var data = {};
data[CSRF] = csrf;

$.ajaxSetup({ 'data': data });

data: { csrf_test_name: 'xxx', ... }セットアップ後にリクエストに含める必要はありません。

于 2012-08-07T01:38:39.880 に答える