为了账号安全,请及时绑定邮箱和手机立即绑定

CORS 简单解释

Chat GPT生成的图片

原文链接

你可能见过这种情况很多次了吧?

有成千上萬篇文章解釋如何修復上述錯誤,但“跨源資源共享(CORS)”究竟是什么,它又是怎么來的,為什麼會有這個東西?

为什么???

让我们先通过一个场景来回答为什么,然后看看它在不同时间点上会如何发展。

想象一下:你登录了bank.com,这是你的银行服务。登录后,会在你的浏览器中存储一个“会话 cookie”。会话 cookie 告诉bank.com背后的服务器,你的浏览器当前已登录到你的账户。以后对bank.com的所有请求都将包含这个 cookie,服务器会认为你已登录,并作出相应的回应。
好的,现在你决定查看你的邮箱。你看到一封可疑的邮件,并且决定点击其中的链接,这将你带到attack.com。记得,由于你浏览器中的那个会话 cookie,bank.com仍然认为你是登录状态。接下来,这个网站向bank.com发送请求以获取你的银行信息。对于bank.com服务器来说,这看起来像你正常请求银行信息,因此它会将信息返回。现在,attack.com可以访问这些信息,并恶意存储它们。

人们觉得这不太好,于是浏览器采用了同源策略(Same-Origin Policy),如果发现你试图从任何地方(除了 bank.com)向 bank.com 发出请求,这些请求将会被阻止。这一点很重要——这实际上是一个浏览器层面的策略bank.com 实际上无法得知请求来自哪里,因此不能很好地防范如 CSRF 这样的攻击。你的浏览器会介入并规定,如果看起来你在尝试向某个源(如 https://foo.com:4000http://bar.org:3000 等 URL)发送请求,它只会发送相同源的请求。

这确实很棒,但它限制性太强了。我的意思是,公共API根本无法直接使用。除非你通过某种代理解决方案,否则你就无法请求数据。

zh: CSRF (跨站请求伪造)

你知道吗:服务器其实可以猜出请求是从哪里来的。有一个“Origin来源”,请求通常会带上这个信息,表明是哪个来源发起的请求。比如在刚才那个例子中,请求大概就是这个样子。

发往 bank.com, {
  源: http://attack.com
}

理论上来说,bank.com 应该检查这一点以确保它只回应来自合理来源的请求。通常它确实如此,因此,同源策略似乎有点局限性。
这就是CORS登场的地方。

zh: CORS (跨域资源共享)

依据SOP,此类跨源请求不会被直接阻止,而是bank.com的服务器可以检查这个Origin头,并根据自己的CORS策略决定是否允许或拒绝该请求。当来自example.com的网站尝试从bank.com请求资源时,浏览器会在请求中自动包含一个Origin头,表明请求来自example.com

如果 bank.com 认为 example.com 可信,或者请求的资源是公开的,它可以返回特定的 CORS 标头,如 Access-Control-Allow-Origin,指明哪些来源可以访问该资源。此标头可以设置为 http://example.com,明确允许该来源,或设置为 *,以允许任何来源访问。

当然,浏览器让这一切变得简单。如果其中有任何错误的话,你就会看到那个讨厌的错误提示。

那如果请求没有Origin头部又会怎样?如果它包含多个其他的头部,而是使用了其他方法又会怎样?

在这种情况下,CORS的处理就会变得稍微复杂一些,因为它不再是一个“简单请求”。这时候,CORS中的“预检查”请求的概念就显得很重要了。

起飞前检查

对于可能修改服务器数据的某些请求,如果它们使用 PUT 或 DELETE 方法,或带有不会自动包含在每个请求中的特殊头部,浏览器会先发送一个“预检”请求,之后再发送实际请求。这个“预检”请求是一个 HTTP OPTIONS 请求,其目的是确认服务器是否允许发送实际请求。

前置请求包含了描述实际请求的HTTP方法及其头部信息。接下来:

  1. 服务器响应:如果服务器支持CORS策略并且实际请求也得到支持,它会用包含允许的方法和头部的响应头来响应预检请求。这可能包括如 Access-Control-Allow-MethodsAccess-Control-Allow-Headers 这样的响应头。
  2. 浏览器决策:根据服务器对预检请求的响应结果,浏览器决定是否继续实际请求。如果服务器的响应表明请求被允许,浏览器会发送实际请求;如果未被允许,浏览器会阻止请求,你会看到一个与CORS相关的错误信息。

所以,最后的结论是...

现在,希望你对CORS有了更多的了解。我认为最重要的是要明白,这一切都是浏览器的策略,你的服务器必须按照这些政策编写以符合要求。它的目的是保护你。如果你使用的是Chrome浏览器,你不必太担心点击错误的链接(当然,你仍然应该稍微有点警惕 :D)。然而,这并不是一个绝对安全的策略。如果你使用的是不遵循标准的第三方浏览器,所有这些保护措施都会失效。这就是为什么一定要谨慎选择使用的软件!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消