引入预检 CORS 请求背后的动机是什么?

2024-01-07

跨域资源共享是一种允许网页向另一个域(从维基百科 https://en.wikipedia.org/wiki/Cross-origin_resource_sharing).

过去几天我一直在摆弄 CORS,我想我对一切的工作原理有了很好的理解。

所以我的问题不是关于 CORS / 预检如何工作,而是关于将预检作为新请求类型的原因。我不明白为什么服务器 A 需要向服务器 B 发送预检(PR)只是为了查明真正的请求(RR)是否会被接受 - B 肯定有可能接受/拒绝 RR 而无需任何先前的公关。

经过一番搜索后我发现这件作品 https://www.w3.org/TR/cors/#preflight-request的信息在www.w3.org http://www.w3.org(7.1.5):

为了保护资源免受在本规范存在之前无法源自某些用户代理的跨源请求的影响 发出预检请求是为了确保资源知道这一点 规格。

我发现这是有史以来最难理解的句子。我的解释(最好称之为“最佳猜测”)是,它是为了保护服务器 B 免受来自不了解规范的服务器 C 的请求。

有人可以解释一下场景/展示 PR + RR 比单独 RR 解决得更好的问题吗?


我花了一些时间对飞行前请求的目的感到困惑,但我想我现在已经明白了。

关键的见解是预检请求不是security事物。相反,他们是一个不改变规则 thing.

预检请求与安全性无关,并且与现在正在开发的具有 CORS 意识的应用程序无关。相反,预检机制有利于开发的服务器without对 CORS 的感知,它充当客户端和服务器之间的健全性检查,确保它们都支持 CORS。 CORS 的开发人员认为,有足够多的服务器依赖于他们永远不会收到的假设,例如他们发明了预检机制以允许双方选择加入的跨域删除请求。他们认为,简单地启用跨域调用的替代方案会破坏太多现有应用程序。

这里有三种情况:

  1. 旧服务器,不再开发,并且在 CORS 之前开发。这些服务器可能会假设他们永远不会收到例如跨域 DELETE 请求。这种场景是预检机制的主要受益者。是的,这些服务可能已经被恶意或不合格的用户代理滥用(CORS 无法改变这一点),但在具有 CORS 的世界中,预检机制提供了额外的“健全性检查”,以便客户端和服务器不会这样做。打破是因为网络的基本规则已经改变。

  2. 仍在开发中的服务器,但包含大量旧代码,并且审核所有旧代码以确保其在跨域世界中正常工作是不可行/不合需要的。这种情况允许服务器逐步选择加入 CORS,例如通过说“现在我将允许这个特定的标头”、“现在我将允许这个特定的 HTTP 动词”、“现在我将允许发送 cookie/auth 信息”等。这种情况受益于预检机制。

  3. 编写时考虑到 CORS 的新服务器。根据标准安全实践,服务器必须在面临以下情况时保护其资源:any传入请求——服务器不能相信客户端不会做恶意的事情。这种情况不会受益于预检机制:预检机制不会为已正确保护其资源的服务器带来额外的安全性。

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

引入预检 CORS 请求背后的动机是什么? 的相关文章

随机推荐

  • CSS/HTML:使文本斜体的正确方法是什么?

    是什么correct使文本斜体的方法 我见过以下四种方法 i Italic Text i em Italic Text em span class italic Italic Text span span class footnote It
  • (在Video.js中)如何设置自定义请求标头?

    遇到这个问题后 我根据以下内容编写了一个最小的示例本文档 https github com videojs http streaming hlsxhr
  • 向 Django 管理站点添加忘记密码功能

    如何将忘记密码功能添加到 Django 管理站点 有电子邮件 安全问题选项吗 有可用的插件 扩展吗 它们都是在 django 中构建的 只需添加相关的 url 模式即可 如下 from django contrib auth import
  • 使用 $ 运算符将两个括号链接在一起

    我有这个功能 min max 10 20 max 30 40 我可以将其重写为 min max 10 20 max 30 40 但是还有没有办法解决最后的括号呢 并不是说这还不够好 但我只是不能放弃这个想法 必须有某种方法可以做到这一点 如
  • 休眠序列不存在

    我尝试使用 spring 在我的项目中将 hibernate 从 4 升级到 54 2版本 升级后 当我调用更新方法时 我在堆栈跟踪中发现以下错误 10 53 32 185 ERROR TableStructure 149 could no
  • 在 WebView 中启用长按

    在浏览器中 您可以长按 URL 在我的 WebView 中 你不能 我怎样才能做到你也能做到 我也有同样的问题 不幸的是 我找不到一种方法来显示标准浏览器菜单选项 您必须自己实现每一项 我所做的是将 WebView 注册为上下文菜单acti
  • 通过 ingress 服务从 kubernetes pod 发送 http 请求到 Minikube 中的另一个 pod

    我在 Oracle VM Virtualbox 中使用 Minikube 单节点 Kubernetes 集群 节点中的一个 Pod 是基于 Next js 的客户端 其余 Pod 是不同的微服务 假设我的客户端 Pod1 需要在渲染之前向身
  • Firebase 数据库规则语法错误

    rules Users user id Grants write access to the owner of this user account whose uid must exactly match the key user id w
  • 如何自动生成创建或修改的时间戳字段?

    我的实体类 Entity Table name user public class User implements Serializable private static final long serialVersionUID 1L Id
  • Unity DI 从特定程序集自动注册

    我正在尝试使用 Unity Registration by Convention 功能 我不知道如何从特定的程序集 项目文件中注册以 Repository 结尾的文件 container RegisterTypes AllClasses F
  • 制作 python 程序发牌时遇到的麻烦。

    我想做一个纸牌游戏 我所坚持的是发牌 我所做的就是对每张卡制定一个指令 并赋予它一个值 因为有些卡比其他卡更有价值 我的想法是将字典分成4部分 或者将每本字典复印4份 然后从每份中删除39张卡片 每人留下13张卡片 这是否可能 或者我是否以
  • std unique_ptrs 的 stl 集合的 boost 序列化

    我希望能够序列化 std unique ptrs 的 stl 容器 能做到吗 顺便说一句 单个 std unique ptr 一切正常 下面是我正在处理的代码 gcc 给出以下错误 use of deleted function std u
  • JavaScript 运算符“in”

    我已经习惯了 python 所以 a 1 2 3 1 in a gt True b 1 2 3 x x in b gt True 为什么在 JavaScript 中会这样 a 1 2 3 1 in a gt true b 1 2 3 x x
  • 使用 ksoap2-android SOAP 客户端从 WSDL 生成 Java 以在 Android 上使用?

    我必须从 Android 应用程序访问现有的 SOAP Web 服务 我已获得一些描述 Web 服务的 WSDL 文件 读一些SO的其他答案 https stackoverflow com questions 297586 how to c
  • C# - 在 div id 上使用 FindControl 时出错

    我有一个 ASP NET 站点 我试图通过 C 代码隐藏文件中的 ID 访问 div 元素 本质上我想查看 div 元素是否存在 如果存在 则更改其属性 我发现许多资源都指向十几种不同的解决方案 但似乎没有一个有效 ASP Net 页面上的
  • Team Foundation Server 无法构建。缺少库或组件?

    我正在尝试使用 TFS 和构建服务器创建构建 这是我第一次尝试构建服务器 但进展并不顺利 我正在使用 Visual Studio 2012 和 TFS 2012 该项目是用 VB Net 编写的 并使用了相当多的参考资料 当我在我的开发机器
  • windows下是否可以删除某个进程打开的文件?

    出于测试和模拟的目的 我想删除我的进程当前打开的文件 The 创建文件文档 http msdn microsoft com en us library aa363858 28v VS 85 29 aspx声明可以以某种模式打开文件 FILE
  • 无法打开主机 WCF REST 服务

    我正在尝试实现一些 WCF 和 REST 服务来在我的服务器上上传文件 并且我找到了一些我正在尝试实现的代码 但尚未成功 My code class Program static void Main string args string a
  • 如何设置 Dojo 对话框打开的位置?

    我有一个 Dojo 对话框 当用户单击页面上的元素时会打开该对话框 我想控制它打开的位置 我真的希望它在单击的其他 dom 元素旁边 相对于 打开 但我似乎可以弄清楚如何执行上述任一操作 感谢您的任何建议 打开一个与 dojo 相对于单击位
  • 引入预检 CORS 请求背后的动机是什么?

    跨域资源共享是一种允许网页向另一个域 从维基百科 https en wikipedia org wiki Cross origin resource sharing 过去几天我一直在摆弄 CORS 我想我对一切的工作原理有了很好的理解 所以