我已经在我的应用程序中实现了对CSRF攻击的缓解,这些信息是我在互联网上的一些博客文章中读到的。特别是,这些帖子一直是我实施的驱动力
- ASP.NET和Web工具开发人员内容团队提供的ASP.NET MVC最佳实践
- Phil Haack博客中的跨站点请求伪造攻击剖析
- ASP.NET MVC框架中的AntiForgeryToken-David Hayden博客中的Html.AntiForgeryToken和ValidateAntiForgeryToken属性
基本上,这些文章和建议指出,为了防止CSRF攻击,任何人都应该实现以下代码:
-
在接受POST Http谓词的每个操作上添加
[ValidateAntiForgeryToken][HttpPost]
[ValidateAntiForgeryToken]
公共行动结果SomeAction(SomeModel模型){
} -
添加
<;%=Html.AntiForgeryToken()%>帮助程序
无论如何,在我的应用程序的某些部分中,我使用jQuery向服务器发送Ajax帖子,而没有任何表单。例如,当我让用户单击图像以执行特定操作时,就会发生这种情况
假设我有一张有活动列表的桌子。我在表格的一列上有一个图像,上面写着;“将活动标记为已完成”;当用户单击该活动时,我正在执行以下示例中的Ajax帖子:
$(“a.markAsDone”)。单击(函数(事件){
event.preventDefault();
$.ajax({
类型:“post”;,
数据类型:“html”;,
url:$(this.attr(“rel”),
数据:{},
成功:功能(响应){
// ....
}
});
});
如何使用<;%=Html.AntiForgeryToken()%>在这些情况下?我应该在Ajax调用的数据参数中包含helper调用吗
很抱歉发了这么长的帖子,非常感谢你的帮助
编辑:
根据jayrdub的回答,我采用了以下方式
$(“a.markAsDone”)。单击(函数(事件){
event.preventDefault();
$.ajax({
类型:“post”;,
数据类型:“html”;,
url:$(this.attr(“rel”),
数据:{
AddAntiForgeryToken({}),
id:parseInt($(this.attr)(“title”)
},
成功:功能(响应){
// ....
}
});
});
我使用这样一个简单的js函数
AddAntiForgeryToken=函数(数据){
数据.uuu RequestVerificationToken=$('#uuu AjaxAntiForgeryForm输入[name=uuu RequestVerificationToken]')。val();
返回数据;
};
由于页面上的每个表单都具有相同的令牌值,所以只需在最上面的母版页中放置类似的内容
<;%——用于AddAntiForgeryToken()中的ajax--%>;
<;表单id=“\uu AjaxAntiForgeryForm”操作=“#”方法=“post”><;%=Html.AntiForgeryToken()%></表格>;
然后在ajax调用中执行(编辑以匹配第二个示例)
$.ajax({
类型:“post”,
数据类型:“html”,
url:$(this.attr(“rel”),
数据:AddAntiForgeryToken({id:parseInt($(this.attr(“title”))}),
成功:功能(响应){
// ....
}
});