我已经在我的应用程序中实施了缓解措施CSRF 攻击 https://en.wikipedia.org/wiki/Cross-site_request_forgery以下是我在互联网上的一些博客文章中读到的信息。特别是这些帖子是我实施的驱动力
-
ASP.NET MVC 最佳实践 https://web.archive.org/web/20160301164154/http://blogs.msdn.com:80/b/aspnetue/archive/2010/09/17/second_2d00_post.aspx来自 ASP.NET 和 Web 工具开发人员内容团队
-
跨站点请求伪造攻击的剖析 https://haacked.com/archive/2009/04/02/anatomy-of-csrf-attack.aspx/来自菲尔·哈克博客
-
ASP.NET MVC 框架中的 AntiForgeryToken - Html.AntiForgeryToken 和 ValidateAntiForgeryToken 属性 http://davidhayden.com/blog/dave/archive/2009/04/29/AntiForgeryTokenInMVCFramework.aspx来自大卫·海登博客
基本上这些文章和建议说,为了防止 CSRF 攻击,任何人都应该实现以下代码:
-
Add the [ValidateAntiForgeryToken]
在接受 POST Http 动词的每个操作上
[http邮报]
[验证防伪令牌]
公共 ActionResult SomeAction( SomeModel 模型 ) {
}
-
Add the <%= 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 调用的数据参数中包含帮助程序调用吗?
抱歉发了这么长的帖子,非常感谢您的帮助
EDIT:
As per jayrdub https://stackoverflow.com/questions/4074199/jquery-ajax-calls-and-the-html-antiforgerytoken/4074289#4074289回答我用了以下方式
$("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) {
// ....
}
});
});