根据我在互联网上的一些博客文章中阅读的信息,我已经在我的应用程序中实现了对CSRF 攻击的缓解。特别是这些帖子是我实施的驱动力
- 来自 ASP.NET 和 Web 工具开发人员内容团队的 ASP.NET MVC 最佳实践
- Phil Haack 博客的跨站点请求伪造攻击剖析
- ASP.NET MVC 框架中的 AntiForgeryToken - David Hayden 博客中的 Html.AntiForgeryToken 和 ValidateAntiForgeryToken 属性
基本上这些文章和建议说,为了防止 CSRF 攻击,任何人都应该实现以下代码:
添加
[ValidateAntiForgeryToken]
接受 POST Http 动词的每个动作[HttpPost] [ValidateAntiForgeryToken] public ActionResult SomeAction( SomeModel model ) { }
<%= 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) {
// ....
}
});
});