Asp.net-Mvc

jQuery Ajax 呼叫和 Html.AntiForgeryToken()

  • November 2, 2010

根據我在網際網路上的一些部落格文章中閱讀的資訊,我已經在我的應用程序中實現了對CSRF 攻擊的緩解。特別是這些文章是我實施的驅動力

基本上這些文章和建議說,為了防止 CSRF 攻擊,任何人都應該實現以下程式碼:

  1. 添加[ValidateAntiForgeryToken]接受 POST Http 動詞的每個動作

[HttpPost] [ValidateAntiForgeryToken] public ActionResult SomeAction( SomeModel model ) { } 2. <%= Html.AntiForgeryToken() %>在向伺服器送出數據的表單中添加助手

無論如何,在我的應用程序的某些部分,我正在使用 jQuery 向伺服器發送 Ajax POST,根本沒有任何形式。例如,當我讓使用者點擊圖像以執行特定操作時,就會發生這種情況。

假設我有一張包含活動列表的表格。我在表格的一列上有一張圖片,上面寫著“將活動標記為已完成”,當使用者點擊該活動時,我正在執行 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 參數中包含輔助呼叫嗎?

對不起,很長的文章,非常感謝您的幫助

編輯

根據jayrdub的回答,我使用了以下方式

$("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 呼叫中執行(編輯以匹配您的第二個範例)

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

引用自:https://stackoverflow.com/questions/4074199