当前位置: 首页 > 知识库问答 >
问题:

引入飞行前CORS请求背后的动机是什么?

曾华翰
2023-03-14

跨源资源共享是一种允许web页面对另一个域(从wikipedia)进行XMLHttpRequest的机制。

最近几天我一直在摆弄CORS,我想我已经很好地理解了一切的工作原理。

所以我的问题不是关于CORS/preflight是如何工作的,而是关于将preflight作为一种新的请求类型背后的原因。我看不出为什么服务器A需要向服务器B发送一个预置(PR)来了解真实的请求(RR)是否会被接受-B当然有可能在没有任何预置PR的情况下接受/拒绝RR。

我在www.w3.org(7.1.5):

为了保护资源不受在此规范存在之前不能从某些用户代理发起的跨源请求的影响,提出一个预置请求以确保资源知道此规范。

我发现这是有史以来最难理解的句子。我的解释(应该更好地称之为“最佳猜测”)是,它是关于保护服务器B不受来自服务器C的请求的影响,而服务器C不知道该规范。

谁能解释一个场景/展示一个PR+RR比RR单独解决更好的问题吗?

共有1个答案

唐炳
2023-03-14

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

关键的洞察力是,飞行前请求不是一个安全问题。相反,他们是一个不改变规则的东西。

飞行前的请求与安全性无关,它们与现在正在开发的应用程序也没有关系。相反,预飞行机制有利于那些在没有CORS意识的情况下开发的服务器,它的作用是在客户机和服务器之间检查它们是否都是CORS意识的。CORS的开发人员认为,有足够多的服务器依赖于他们永远不会接收的假设,例如,他们发明了预置机制来允许双方选择加入的跨域删除请求。他们认为,如果只是简单地启用跨域调用,就会破坏太多现有的应用程序

这里有三种场景:

>

  • 旧服务器,不再在开发中,并且在CORS之前开发。这些服务器可能会假设它们永远不会接收到(例如)跨域删除请求。这种情况是预飞行机制的主要受益者。是的,这些服务可能已经被恶意或不符合要求的用户代理滥用了(而CORS并没有改变这一点),但是在有CORS的世界中,预飞行机制提供了一个额外的“健全性检查”,这样客户端和服务器就不会因为web的基本规则已经改变而破坏。

    仍在开发中但包含大量旧代码的服务器,对其进行审计以确保其在跨域环境中正常工作是不可行的/不需要的。该场景允许服务器逐步选择加入CORS,例如,通过说“现在我将允许这个特定的头”、“现在我将允许这个特定的HTTP谓词”、“现在我将允许发送Cookie/Auth信息”等。

    使用CORS编写的新服务器。根据标准的安全实践,服务器必须在面对任何传入的请求时保护其资源--服务器不能信任客户机不做恶意的事情。此场景不能从预置机制中受益:预置机制不会为已正确保护其资源的服务器带来额外的安全性。

  •  类似资料:
    • 问题内容: 跨域资源共享 是一种允许网页向另一个域发出XMLHttpRequests的机制。 在过去的几天里,我一直在摆弄CORS,我认为我对所有工作原理都非常了解。 因此,我的问题不是关于CORS /预检如何工作,而是关于 将预检作为新的请求类型的原因 。我看不到任何原因,为什么服务器A需要向服务器B发送预检(PR)只是为了确定是否接受实际请求(RR)-B肯定有可能在没有请求的情况下接受/拒绝R

    • 我使用AJAX请求通过POST将数据发送到另一个域。因为我的内容类型不是标准的(它是JSON格式),所以需要一个飞行前请求。(使用请求方法:选项) 如维基百科跨域XHR调用图表中所述 我想知道这是否很费时,因为浏览器将必须到达服务器两次或不?也许这取决于每个浏览器的行为? 通过使用内容类型“纯文本”来避免飞行前请求,我是否获得了一些时间?

    • 我有一个Spring Boot/Spring Data REST服务,允许访问许多资源。其中一些资源(例如)可以自由访问,其他资源(例如)需要基本的HTTP身份验证。通过使用CURL测试REST服务,所有工作都按预期进行。当我试图从Angular2 web应用程序访问服务时,问题就会出现。

    • 问题内容: 我现在奋斗了几个小时。我想向另一个域发出简单的Ajax请求,但始终出现http 401错误: 我在服务器端设置了所有相关的CORS标头。这是网络流量: 我知道有很多关于此主题的文章,但似乎我缺少一些简单的东西。有人可以帮我吗? 问题答案: 更新 看起来我不对。标头从不发送请求。 -你需要确保你的服务器不响应到请求。 我不知道您的服务器用什么语言编写,但是您以错误的方式实现了授权-应该从

    • 我有一个云函数,它在我的客户机上验证表单提交的输入。我正在使用云函数用于带有cors express中间件的Firebase https触发器。 Firebase功能 对函数的客户端调用 问题 是否可以防止firebase在预飞行请求上触发函数调用?如果没有,那么是否有一种方法可以阻止预飞行请求并成功地将数据传递给函数。

    • 在调试我遇到的CORS问题时,我发现了以下行为。Chrome发出以下选项预检请求(由Chrome本身在CURL中重写): 以下情况下服务器对此请求的响应: 是响应“无效CORS请求”的主体。如果我重复该请求,删除标头“Access Control request Method”(仅该标头),则OPTIONS请求将成功,并得到以下响应: 然而,有问题的头是CORS规范标准头,所以它不应该阻止请求成功