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 ) {
}
2)在<%= Html.AntiForgeryToken() %>
将数据提交到服务器的表单内添加帮助程序
<div style="text-align:right; padding: 8px;"> <%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
无论如何,在我的应用程序的某些部分中,我都使用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参数中包括helper调用?
对不起,很长的帖子,非常感谢您的帮助
:
按照ayrdub的回答,我已经用下面的方式
$("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() 的全部内容, 来源链接: utcz.com/qa/413009.html