jQuery Ajax 调用和 Html.AntiForgeryToken()

根据我在互联网上的一些博客文章中阅读的信息,我已经在我的应用程序中实现了对CSRF

攻击的缓解。特别是这些帖子是我实施的驱动力

  • 来自 ASP.NET 和 Web 工具开发人员内容团队的 ASP.NET MVC 最佳实践
  • Phil Haack 博客的跨站点请求伪造攻击剖析
  • ASP.NET MVC 框架中的 AntiForgeryToken - David Hayden 博客中的 Html.AntiForgeryToken 和 ValidateAntiForgeryToken 属性

基本上这些文章和建议说,为了防止 CSRF 攻击,任何人都应该实现以下代码:

  1. 添加[ValidateAntiForgeryToken]接受 POST Http 动词的每个动作

[HttpPost] [ValidateAntiForgeryToken] public ActionResult SomeAction(

SomeModel model ) { }

  1. <%= 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) {

// ....

}

});

以上是 jQuery Ajax 调用和 Html.AntiForgeryToken() 的全部内容, 来源链接: www.h5w3.com/z/754575.html

回到顶部