jQuery Ajax 调用和 Html.AntiForgeryToken()

2023-12-20

我已经在我的应用程序中实施了缓解措施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 攻击,任何人都应该实现以下代码:

  1. Add the [ValidateAntiForgeryToken]在接受 POST Http 动词的每个操作上

    [http邮报] [验证防伪令牌] 公共 ActionResult SomeAction( SomeModel 模型 ) { }

  2. 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) {
            // ....
        }
    });
});

我使用像这样的简单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) {
        // ....
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jQuery Ajax 调用和 Html.AntiForgeryToken() 的相关文章

随机推荐

  • 使用 spring 在 Ibm Websphere MQ 中实现重试逻辑

    我正在使用 Spring 和 Websphere MQ 进行以下消息传递配置 我需要实现一个场景的重试逻辑 其中我从队列接收消息并将消息数据放到弹性搜索服务器 搜索服务器是非事务性的 如果搜索服务器关闭 我必须回滚消息再次放入队列并在一段时
  • 如何在Rails中管理3个多对多模型

    我正在跟进铁路广播公司 http railscasts com episodes 47 two many to many制作不同模型进行维护的建议many to many关系 但是 我在提取传递关系数据时遇到问题 假设有 3 个多对多模型
  • Android 2.2 - 如何检测我是否安装在 SDCard 上?

    我正在编写一个存储大量媒体文件的 Android 应用程序 它们不是那种会弄乱用户通知或其他媒体目录的类型 而且数量太多 但它们也必须是用户可更新的 所以我不能将它们放入资源中 我可以使用 getExternalFilesDir 获取 SD
  • DLL-导出模板基类的静态成员

    在 DLL 中 我有一个带有模板基类的导出非模板类 该模板基类有一个静态成员变量 我在链接到具有导出的非模板类的 DLL 的可执行文件中使用静态基成员 在许多情况下 我会收到未解决的外部符号或有关不一致链接的投诉 我发现了一种可行的方案 但
  • TDD、DDD 和封装

    经过几年遵循我工作场所 架构师 传下来的不良实践并认为一定有更好的方法之后 我最近一直在阅读有关 TDD 和 DDD 的内容 我认为这些原则和实践将是一个很好的方法 非常适合我们编写的软件的复杂性 然而 我见过的许多 TDD 示例都调用域对
  • Flutter:应用程序的区域设置不受其所有本地化代表的支持

    您好 我正在尝试在 flutter 应用程序中添加 BottomNavigationBar 但当我运行项目时出现错误 A MaterialLocalizations delegate that supports the ka GE loca
  • 将应用程序设置存储在项目文件夹而不是 AppData 中

    我的项目中有一个 Settings cs 文件 我通过以下方式从程序访问其中的数据 Properties Settings Default MyProperty 生成的设置文件存储在以下位置 C Users Foo AppData Loca
  • android ndk 开发问题:memcpy 函数出现“无效参数”错误

    我在android项目中使用了c 代码 所以我使用了NDK工具 IDE是eclipse 编译项目时 我收到错误memcpy功能 Invalid arguments Candidates are void memcpy void const
  • DropDownList-项目在回发时为空

    我有 DropDownList 我必须将其填充到与另一个控件的单击事件关联的事件中 数据已填充并存在 但当我选择一个值并回发时 该值为空 这意味着视图状态不起作用 解决方案说在 Init 中填充 DropDown 但我不能 因为要求不允许这
  • 在 Laravel 4 中设置自动增量初始值

    有没有办法使用 Schema Builder 的迁移来设置 Laravel 4 中表上主键的自动增量初始值 我想将表的 id 设置为从 100 开始 我知道使用纯 SQL 可以做到这一点ALTER TABLE MY TABLE AUTO I
  • 如何使用第一个逗号将字符串拆分为段落?

    我有字符串 address 10 Madison Avenue New York NY 212 538 1884 像这样分割它的最好方法是什么 p 10 Madison Avenue p p New York NY 212 538 1884
  • Apache Maven 错误:无法将工件 org.apache.maven.plugins:maven-clean-plugin:pom: 2.5 传输到中央

    我对此很陌生 我正在 apache maven 上工作 我在代理服务器后面工作 每次 我都会尝试构建maven项目 它给了我这个错误 我还更改了 settings xml 文件中的代理设置 但它不起作用 它一直给我同样的问题 构建失败 我在
  • 如何修复缺少对象的 git 存储库?

    我的开发存储库在某个时候丢失了一个对象 git fsck fatal failed to read object 2dddc84156fa30e4614a7ea5a1895885011b8db8 Invalid argument git c
  • 如何允许特定服务器访问我的API?

    我正在使用node js express和mongodb编写一个API 它将在另一台服务器中使用 我只希望该服务器 或将来的更多服务器 能够访问我的 API 我怎样才能做到这一点 如果您只想根据另一台服务器的 IP 进行限制 那么您可以定义
  • numpy 和 pandas timedelta 错误

    在 Python 中 我使用 pandas 生成了一个日期数组 或从 CSV 文件中读取 并且我想为每个日期添加一年 我可以使用 pandas 让它工作 但不能使用 numpy 我究竟做错了什么 或者这是 pandas 或 numpy 中的
  • 线性回归预测中的个别项

    我在 R 中对某些数据集进行了回归分析 并尝试预测数据集中每行的每个自变量对因变量的贡献 所以像这样 set seed 123 y lt rnorm 10 m lt data frame v1 rnorm 10 v2 rnorm 10 v3
  • 停止Excel科学计数法转换[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有办法停止Excel将数据转换为科学记数法 Microsoft Excel 显然假定任何包含数字和 E 的数据都应该是科学记数法并将其
  • 编写集成高斯的 Python 函数的最佳方法?

    在尝试使用 scipy 的四边形方法对高斯进行积分时 假设有一个名为 gauss 的高斯方法 我在将所需参数传递给高斯并让四边形对正确的变量进行积分时遇到问题 有谁有一个关于如何使用四元组和多维函数的好例子吗 但这让我产生了一个更宏大的问题
  • 在 JavaFX 中使用包含伪类的查询

    我正在尝试在编程查询中使用伪类Node lookupAll 然而这似乎给出了意想不到的结果 我在网上搜索过 找不到任何表明 Node lookupAll 不支持伪类的信息 public class Foo extends Applicati
  • jQuery Ajax 调用和 Html.AntiForgeryToken()

    我已经在我的应用程序中实施了缓解措施CSRF 攻击 https en wikipedia org wiki Cross site request forgery以下是我在互联网上的一些博客文章中读到的信息 特别是这些帖子是我实施的驱动力 A