1. ホーム
  2. asp.net-mvc

[解決済み】jQuery Ajaxの呼び出しとHtml.AntiForgeryToken()について)

2022-04-10 02:31:45

質問

私のアプリでは、以下のような緩和策を実装しています。 CSRF攻撃 インターネット上のいくつかのブログ記事で読んだ情報に従って。特に、これらの投稿は私の実装の原動力となりました。

基本的に、これらの記事や勧告は、CSRF攻撃を防ぐために、誰もが以下のコードを実装する必要があると述べています。

  1. を追加します。 [ValidateAntiForgeryToken] POST Http 動詞を受け入れるすべてのアクションに適用されます。

    [HttpPost] [ValidateAntiForgeryToken] を使用します。 public ActionResult SomeAction( SomeModel model ) {... }

  2. を追加します。 <%= Html.AntiForgeryToken() %> サーバーにデータを送信するフォームの中にあるヘルパーです。

とにかく、私のアプリの一部では、フォームをまったく持たずにjQueryでサーバーにAjax POSTしています。これは、例えば、ユーザーが画像をクリックして特定のアクションを実行するような場合に起こります。

例えば、アクティビティーのリストを持つテーブルがあるとします。テーブルのカラムに「"Mark activity as completed"」という画像があり、ユーザーがそのアクティビティをクリックすると、次のサンプルのようにAjax POSTが実行されます。

$("a.markAsDone").click(function (event) {
    event.preventDefault();
    $.ajax({
        type: "post",
        dataType: "html",
        url: $(this).attr("rel"),
        data: {},
        success: function (response) {
            // ....
        }
    });
});

を使用するにはどうすればよいですか? <%= Html.AntiForgeryToken() %> のような場合でしょうか?Ajax呼び出しのdataパラメータ内にヘルパー呼び出しを含めるべきですか?

長文で申し訳ありません。

EDIT :

の通りです。 ジェイダブ 回答 私は次のように使っています。

$("a.markAsDone").click(function (event) {
    event.preventDefault();
    $.ajax({
        type: "post",
        dataType: "html",
        url: $(this).attr("rel"),
        data: {
            AddAntiForgeryToken({}),
            id: parseInt($(this).attr("title"))
        },
        success: function (response) {
            // ....
        }
    });
});

解決方法は?

私は以下のような簡単なjs関数を使っています。

AddAntiForgeryToken = function(data) {
    data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
    return data;
};

トークンはページ上のすべてのフォームに同じ値が設定されるので、最上位のマスターページに次のような記述をするだけです。

<%-- used for ajax in AddAntiForgeryToken() --%>
<form id="__AjaxAntiForgeryForm" action="#" method="post"><%= Html.AntiForgeryToken()%></form>  

次に、ajaxコールで次のようにします (2番目の例と一致するように編集)。

$.ajax({
    type: "post",
    dataType: "html",
    url: $(this).attr("rel"),
    data: AddAntiForgeryToken({ id: parseInt($(this).attr("title")) }),
    success: function (response) {
        // ....
    }
});