当前位置: 首页 > 面试题库 >

CORS-引入飞行前要求的动机是什么?

毛勇
2023-03-14
问题内容

跨域资源共享 是一种允许网页向另一个域发出XMLHttpRequests的机制。

在过去的几天里,我一直在摆弄CORS,我认为我对所有工作原理都非常了解。

因此,我的问题不是关于CORS /预检如何工作,而是关于 将预检作为新的请求类型的原因
。我看不到任何原因,为什么服务器A需要向服务器B发送预检(PR)只是为了确定是否接受实际请求(RR)-B肯定有可能在没有请求的情况下接受/拒绝RR任何先前的PR。

经过大量搜索后,我在www.w3.org(7.1.5)上找到了以下信息:

为了保护资源免受在该规范存在之前可能源自某些用户代理的跨域请求,将进行预检请求以确保资源了解此规范。

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

有人可以解释一个情况/显示PR + RR比单独使用RR更好地解决问题吗?


问题答案:

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

关键见解是,起飞前的要求不是 安全的 事情。相反,它们是 不变的规则

预检请求与html" target="_blank">安全无关,并且与具有CORS意识的当前开发的应用程序无关。相反,预检机制 会使 在不了解CORS的 情况下
开发的服务器受益,并且它充当客户端和服务器之间是否都知道CORS的健全性检查。CORS的开发人员认为那里有足够的服务器依赖于它们永远不会收到的假设,例如,跨域DELETE请求他们发明了预检机制以允许双方选择加入。他们认为,仅允许跨域调用的替代方案将破坏太多现有应用程序。

这里有三种情况:

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

  2. 仍在开发中的服务器,但是其中包含许多旧代码,并且对于这些服务器不可行/不希望审核所有旧代码以确保其在跨域环境中正常运行。这种情况允许服务器逐步加入CORS,例如说“现在我将允许这个特定的标头”,“现在我将允许这个特定的HTTP动词”,“现在我将允许cookie / auth信息成为已发送”等。 这种情况将从预检机制中受益。

  3. 编写具有CORS意识的新服务器。根据标准的安全惯例,服务器必须面对 任何 传入请求来保护其资源-服务器无法信任客户端不进行恶意操作。 此方案无法从预检机制中受益 :预检机制不会为已正确保护其资源的服务器带来额外的安全性。



 类似资料:
  • 跨源资源共享是一种允许web页面对另一个域(从wikipedia)进行XMLHttpRequest的机制。 最近几天我一直在摆弄CORS,我想我已经很好地理解了一切的工作原理。 所以我的问题不是关于CORS/preflight是如何工作的,而是关于将preflight作为一种新的请求类型背后的原因。我看不出为什么服务器A需要向服务器B发送一个预置(PR)来了解真实的请求(RR)是否会被接受-B当然

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

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

  • 如果我取出授权头选项,请求就会工作。 我也试过https://github.com/barryvdh/laravel-cors,但仍然没有乐趣。任何帮助都很感激!

  • 问题内容: 我一直认为Ruby中的这个概念是不必要的。我们可以像使用JavaScript一样轻松地使用纯字符串。现在,他们决定将JS中的内容复杂化。 我不明白动机。有人可以向我解释我们是否真的需要JavaScript中的符号? 问题答案: 将符号引入Javascript的最初动机是启用 私有 属性。 不幸的是,它们最终被严重降级。它们不再是私有的,因为您可以通过反射找到它们,例如使用或代理。 它们

  • 我需要添加CORS过滤器到我的Spring Boot web应用程序。 我添加了CORS映射,如下文所述http://docs.spring.io/spring/docs/current/spring-framework-reference/html/CORS.html 这是我的配置: