使用 CORS Origin 标头与 CSRF 令牌进行 CSRF 保护

2023-12-22

这个问题仅涉及防止跨站点请求伪造攻击。

它具体涉及:通过 Origin 标头 (CORS) 提供的保护是否与通过 CSRF 令牌提供的保护一样好?

Example:

  • Alice 使用她的浏览器登录(使用 cookie)https://example.com。我假设她使用现代浏览器。
  • 爱丽丝来访https://evil.example,evil.example 的客户端代码执行某种请求https://example.com(经典的 CSRF 场景)。

So:

  • 如果我们不检查 Origin 标头(服务器端),并且没有 CSRF 令牌,则会出现 CSRF 安全漏洞。
  • 如果我们检查 CSRF 令牌,我们就安全了(但这有点乏味)。
  • 如果我们确实检查 Origin 标头,则来自邪恶.example 的客户端代码的请求应该像使用 CSRF 令牌时一样被阻止 - 除非邪恶.example 的代码可以以某种方式设置 Origin 标头。

我知道,这对于 XHR 来说是不可能的(参见例如跨域资源共享的安全性 https://stackoverflow.com/questions/13242049/security-for-cross-origin-resource-sharing),至少不会,如果我们相信 W3C 规范能够在所有现代浏览器中正确实现(我们可以吗?)

但是其他类型的请求呢?表单提交?正在加载 script/img/... 标签?或者页面可以使用任何其他方式(合法)创建请求?或者也许是一些已知的 JS hack?

注意:我不是在谈论

  • 本机应用程序,
  • 被操纵的浏览器,
  • example.com 页面中的跨站点脚本错误,
  • ...

知道,这对于 XHR 来说是不可能的(例如,参见跨域资源共享的安全性),至少不可能,如果我们相信 W3C 规范能够在所有现代浏览器中正确实现(我们可以吗?)

归根结底,您必须“信任”客户端浏览器来安全地存储用户数据并保护会话的客户端。如果您不信任客户端浏览器,那么您应该停止使用网络来获取静态内容以外的任何内容。即使使用 CSRF 令牌,您也相信客户端浏览器能够正确遵守同源政策 https://www.w3.org/Security/wiki/Same_Origin_Policy.

虽然以前存在浏览器漏洞,例如浏览器5.5/6.0 http://www.securityfocus.com/bid/3721/discuss如果攻击者有可能绕过同源策略并执行攻击,您通常可以预期一旦发现这些问题就会立即修补,并且随着大多数浏览器自动更新,这种风险将大大减轻。

但是其他类型的请求呢?表单提交?正在加载 script/img/... 标签?或者页面可以使用任何其他方式(合法)创建请求?或者也许是一些已知的 JS hack?

The Originheader 通常只针对 XHR 跨域请求发送。图像请求不包含标头。

注意:我不是在谈论

  • 本机应用程序,

  • 被操纵的浏览器,

  • example.com 页面中的跨站点脚本错误,

我不确定这是否属于受操纵的浏览器,但是旧版本的 Flash http://ha.ckers.org/blog/20060725/forging-http-request-headers-with-flash/允许设置任意标头,这将使攻击者能够发送带有欺骗性的请求referer来自受害者机器的标头以执行攻击。

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

使用 CORS Origin 标头与 CSRF 令牌进行 CSRF 保护 的相关文章

  • 如何检测浏览器是否支持自定义元素

    我正在查看 Modernizr 它应该有助于功能检测 这应该可以帮助确定您的网站是否与给定的 Web 浏览器兼容 但我没有看到任何表明我可以使用它来检测自定义 HTML 的内容我们在内容中创建和定义的元素 如果不是 Modernizr 我如
  • 如何在同一页面上使用AJAX处理多个表单

    我有一个表单 当我单击 提交 时 它就被提交了 然后该表单隐藏 操作页面的结果显示在 div 中 classname dig 它工作正常 但是当我添加另一个表单时 它停止正常工作并且所有表单同时提交 我如何更改我的代码 done click
  • React js Stripe 结账不起作用

    我正在尝试在 React js 应用程序中呈现条带结账默认表单
  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • 使用 useReducers 调度函数发送多个操作?

    使用时是否可以通过调度函数发送多个动作useReducer挂钩反应 我尝试向它传递一组操作 但这会引发未处理的运行时异常 明确地说 通常会有一个初始状态对象和一个减速器 如下所示 const initialState message1 nu
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • 除了更改标题之外,如何在 Firefox 中强制另存为对话框?

    有没有办法在 ff 中强制打开 www example com example pdf 的另存为对话框 我无法更改标题 如果您可以将文件以 Base64 格式输出到客户端 则可以使用 data uri 进行下载 location href
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • FireFox 中的自动滚动

    我的应用程序是实时聊天 我有一个 Div 来包装消息 每条消息都是一个 div 所以 在几条消息之后 我的 DOM 看起来像这样 div div Message number two div div div div
  • 为什么我不能在 AngularJS 中使用 data-* 作为指令的属性名称?

    On the t他的笨蛋 http plnkr co edit l3KoY3 p preview您可以注意到属性名称模式的奇怪行为data 在指令中 电话 Test of data named attribute br
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux

随机推荐