别再对 CORS 视而不见了

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您的旅程的每个阶段提供云产品。立即开始使用 $200 的免费信用额度!

无论如何,我只是需要一个标题。最近我一直在处理大家最喜欢的网络安全功能,我总觉得这是一个应该写点东西的信号,因为这就是写博客的意义所在。

CORS 的主要问题是 开发人员不了解 CORS。它的基本概念应该是很容易的:不要跨域运行代码。这意味着如果我在 css-tricks.com 尝试从外部 URL(如 any-other-website.com)获取一些 JavaScript 代码,浏览器默认情况下会停止它。您将在控制台中看到一个错误。不允许。

除非,当然,另一个网站发送一个 头信息,专门允许这样做。我的域名可以被列入白名单,或者可能有一个通配符允许它。这里有更多细节(比如预检和凭据),而且,一如既往,MDN 文章在这方面做得很好。

我过去总是会感到抓狂,因为 CORS 似乎表现不一致。两个请求会通过,第三个会失败,这似乎无法解释,但却是可重现的。(也许有一个负载均衡器参与了,包含半缓存的头信息?谁知道呢。)或者我正在尝试使用 代理,而代理停止工作。我甚至不记得所有例子,但我敢肯定,我一生中已经参加过超过 100 次关于调试 CORS 问题的会议了。

无论如何,最近 CORS 再次出现在我眼前

  • 这个视频,6 分钟内学习 CORS,有 10,000 个赞,似乎引起了人们的共鸣。一个非讽刺的 npm install cors 是这里的解决方案。
  • 您必须明确地告诉服务器设置正确的头信息。因此,类似于上面的视频,我必须在 关于 Cloudflare Workers 的视频 中这样做,在那里我使用了跨域(但您并不必须这样做,这实际上是 Cloudflare Workers 的一个非常酷的功能)。
  • Jake 的文章 “如何赢得 CORS 比赛”,其中包括一个 游乐场
  • 有一些浏览器扩展(比如 FirefoxChrome 的扩展)可以为您拉取 CORS 头信息,这感觉像是可疑的变通方法,但我不会责怪任何人开发时使用它。
  • 我写过一篇关于 代理...任何东西有多么容易,包括一个第三方 JavaScript 文件,并将其设为第一方。很多人都指出 评论中,这样做会完全删除您从 CORS 获得的保护,这非常危险。同意,除非您完全控制那个第三方,否则它非常危险。