使用 MVC2 的 AJAX 请求中的 CSRF 保护

2024-03-19

我正在构建的页面很大程度上依赖于 AJAX。基本上,只有一个“页面”,并且每次数据传输都是通过 AJAX 处理的。由于浏览器端过度乐观的缓存会导致奇怪的问题(数据未重新加载),因此我必须使用 POST 执行所有请求(也读取) - 这会强制重新加载。

现在我想阻止针对CSRF的页面。通过表单提交,使用Html.AntiForgeryToken()工作得很好,但是在 AJAX 请求中,我想我必须手动附加令牌?有什么开箱即用的东西吗?

我当前的尝试看起来像这样:

我很想重用现有的魔法。然而,HtmlHelper.GetAntiForgeryTokenAndSetCookie是私有的,我不想在 MVC 中乱搞。另一种选择是编写一个扩展,例如

public static string PlainAntiForgeryToken(this HtmlHelper helper)
{
    // extract the actual field value from the hidden input
    return helper.AntiForgeryToken().DoSomeHackyStringActions();
}

这有点hacky并且留下了更大的问题未解决:如何验证该令牌?默认验证实现是内部的,并且针对使用表单字段进行了硬编码。我尝试写一个稍微修改过的ValidateAntiForgeryTokenAttribute,但它使用了AntiForgeryDataSerializer这是私人的,我也不想复制它。

在这一点上,提出一个自行开发的解决方案似乎更容易,但这实际上是重复的代码。

有什么建议如何以聪明的方式做到这一点?我是否遗漏了一些完全明显的东西?


您可以使用常规的Html.AntiForgeryToken()帮助程序在页面上的某个位置(不一定在表单内)生成隐藏字段并将其包含在 ajax 请求中:

var token = $('input[name=__RequestVerificationToken]').val();
$.post(
    '/SomeAction', { '__RequestVerificationToken': token }, 
    function() {
        alert('Account Deleted.');
    }
);

要在服务器端验证它:

[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult SomeAction() 
{
    return View();
}

如果您的页面上有多个令牌,您可能需要指定要包含哪一个。由于现有的帮助器生成具有相同名称的隐藏字段,因此很难制作一个好的选择器,因此您可以将它们放置在跨度内:

<span id="t1"><%= Html.AntiForgeryToken() %></span>
<span id="t2"><%= Html.AntiForgeryToken() %></span>

然后选择对应的token:

var token = $('#t1 input[name=__RequestVerificationToken]').val();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 MVC2 的 AJAX 请求中的 CSRF 保护 的相关文章

随机推荐

  • 将文件夹中的所有文件重命名为编号列表 1.jpg 2.jpg [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 询问代码的问题必须对所解决的问题表现出最低限度的了解 包括尝试的解决方案 为什么它们不起作用以及预期结果 也可以看看 Stack Over
  • 返回 404 的 Rest Web 服务

    这是我第一次使用 Eclipse 这让我非常愤怒 我安装了 Tomcat 6 0 下载了 Jersey 库 并按照以下教程进行操作 http www vogella com articles REST article html first
  • 创建图标按钮 - Android

    我想创建一个小图标按钮 如下所述在材料指南的这一章中 https www google com design spec components buttons html buttons other buttons 但我找不到任何关于如何做到这
  • 我可以调整 tkMessagebox 创建的消息框的大小吗?

    我想用固定宽度的 tkMessagebox 创建信息对话 我在 tkMessagebox showinfo 函数中没有看到任何可以处理此问题的选项 有什么办法吗 谢谢 option add 可能仅适用于 Linux 操作系统 但您可以控制字
  • Javascript:xmlhttprequest 随机卡在就绪状态 1

    我一直在开发一个 Windows 小工具 即 浏览器 是 Internet Explorer 用于查询指定子网地址以获取信息 现在 它有时会以相对较快的速度 大约每 5 秒 执行此操作 而且效果很好 然而 有时它会卡在就绪状态 1 并且永远
  • 使用 Popen.stdin 执行多个命令

    我想使用管道在从 python 脚本启动的独立应用程序中执行多个命令 我可以可靠地将命令传递到程序的标准输入的唯一方法是使用 Popen communicate 但它会在命令执行后关闭程序 如果我使用 Popen stdin write 则
  • 如何列出导入的模块及其版本?

    我需要列出所有导入的模块及其版本 我的一些代码仅适用于特定版本 我想保存包的版本 以便将来再次查找 列出包的名称有效 modules list set sys modules set globals print modules 但如果我现在
  • 注入自动映射器

    我一直致力于将 AutoMapper 注入控制器 我喜欢 Code Camp Server 的实现 它围绕 AutoMapper 的 IMappingEngine 创建一个包装器 依赖注入是使用 StructureMap 完成的 但我需要在
  • 有什么办法让 gmaps4rails 在街景中打开地图吗?

    我尝试过更改缩放级别 但它始终保持在地图模式 在wiki上也找不到任何信息 任何帮助或其他建议将不胜感激 最终只使用了 Google 的 Javascript API 事情是这样的 pos new google maps LatLng va
  • 如何将 Knockout js 模型绑定到向导风格的 UI

    我正在使用 Knockout js 我有一个包含对象数组的视图模型 我希望允许用户使用向导样式界面编辑其中一个对象 我遇到的问题是向导将根据所做的选择显示不同的步骤 例如 如果用户在步骤 1 中选择 是 则我将显示步骤 2a 如果用户在步骤
  • 在读取文件之前检查文件是否已打开?

    我正在尝试制作一个小程序 它以非常频繁的间隔 每秒几次 读取本地文件系统 用户计算机 上的文件 然后通过 javascript 将文件的内容提供给网页 小程序需要读取的文件由用户计算机上的程序高频更新 我担心的是 如果小程序在文件更新过程中
  • toDF 的值不是 org.apache.spark.rdd.RDD 的成员

    例外 val people sc textFile resources people txt map split map p gt Person p 0 p 1 trim toInt toDF value toDF is not a mem
  • 在 GNU C 内联汇编中编写 Linux int 80h 系统调用包装器 [重复]

    这个问题在这里已经有答案了 我正在尝试使用内联汇编 我读过这一页http www codeproject com KB cpp edujini inline asm aspx http www codeproject com KB cpp
  • Python 日期时间:昨天的所有项目

    在 Python 中 如果我想检查昨天的所有项目 我会这样做 from datetime import datetime timedelta if datetime datetime today timedelta days 2 lt it
  • C# 将文本转语音保存到 MP3 文件

    我想知道是否有办法将文本到语音数据保存为 mp3 或 Wav 文件格式以便稍后播放 SpeechSynthesizer reader new SpeechSynthesizer reader Rate int 2 reader Speak
  • Windows 键的键码?

    有没有keyCodeWindows 键或用 Javascript 或 jQuery 检测何时按下的方法 I ve dug through StackOverflow and have found how to detect command
  • 如何在 JavaScript 中一次分配多个变量?

    有没有办法在 JavaScript 中执行多重赋值 如下所示 var a b one two 这相当于 var a one var b two 在 ES6 中你可以这样做 var a b one two 上面的代码是 ES6 表示法 称为数
  • 是否可以使用 Spring XML 访问字符串索引的 getter?

    Spring上下文设置XML语言中是否有 字符串索引 getters的概念 假设我有Persongetter 具有以下原型 class Person Person getRelative String relativeName 我可以用类似
  • Java引用同一目录中的类

    我创建了一个PairJava 中的类 类似于 C 对 并且无法从不同的 java 文件引用它 我正在一个 Java 文件中工作 我们称之为fileA在同一目录中Pair class 另外 我还写过package current direct
  • 使用 MVC2 的 AJAX 请求中的 CSRF 保护

    我正在构建的页面很大程度上依赖于 AJAX 基本上 只有一个 页面 并且每次数据传输都是通过 AJAX 处理的 由于浏览器端过度乐观的缓存会导致奇怪的问题 数据未重新加载 因此我必须使用 POST 执行所有请求 也读取 这会强制重新加载 现