当前位置: 首页 > 面试题库 >

jQuery Ajax调用和Html.AntiForgeryToken()

薄欣怿
2023-03-14
问题内容

我已经在互联网上的一些博客文章中阅读了相关信息,并在自己的应用中实施了缓解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) {
        // ....
    }
});


 类似资料:
  • 我正在尝试使用Struts 2和jQuery构建Web应用程序。 在改变下拉列表时,我需要从数据库中获取详细信息。在我的< code>struts.xml配置中,我将方法和操作定义如下: 当我在所有相应位置进行更改后执行应用程序时,请求被传递给 类和 DAO 方法,并且控件成功返回到屏幕。但是返回的数据在屏幕上不可用,我收到一条错误消息: url…404未在jQuery中找到(匿名函数)ajax。

  • 我正在尝试使用JQuery在Ajax中向请求添加头。 以下是代码:- 然后我使用了要求(要求是chrome火狐插件,我们可以手动添加一个标题到请求)。 手动添加标题后:- 在这两个pics请求头中,“ACCESS-CONTROL-request-HEADERS”中都有x-auth-token,但第二个pic中有“x-auth-token”头和头值,而第一个pic中没有。 所以我的问题是如何使用JQ

  • 它可能非常简单,但我想知道我是否可以在一个方法上调用@cacheable和@cacheevict,如下所示: 上面的代码是在每次调用方法时逐出empListCache,还是只在缓存已满时逐出? 多谢了。

  • 问题内容: 好的,我花了一段时间解决这个问题,这是我收集到的: 如果在IE7中调用AJAX,并且指定了window.onbeforeunload函数,则它将调用onbeforeunload函数。 如果尝试使用window.open打开一个新窗口而又不打扰当前窗口,则会调用onbeforeunload。 有人知道如何制止吗?我什至尝试将变量设置为TRUE,并在onbeforeunload函数中检查该

  • 本文向大家介绍浅析javascript的间隔调用和延时调用,包括了浅析javascript的间隔调用和延时调用的使用技巧和注意事项,需要的朋友参考一下 用 setInterval方法可以以指定的间隔实现循环调用函数,直到clearInterval方法取消循环 用clearInterval方法取消循环时,必须将setInterval方法的调用赋值给一个变量,然后clearInterval方法引用该变

  • 如何在jQuery AJAX中更改成功块中freemarker变量的值,我的页面有两个控制器第一个控制器使用GET方法返回一个带有视图名称的简单字符串,第二个控制器使用json和POST方法处理数据 给你 我的第二个控制器 我的Json方法 我的传呼myform.html 到目前为止,我的freemarker变量得到了我放在success块中的值,但在我按下submit按钮之前它显示为succes