关于跨源资源共享(CORS)如何工作的困惑

use*_*568 5 javascript jquery cross-domain cors

根据我对CORS的理解,这就是它的工作原理:我有一个网站foo.com,它提供页面X.X想要将数据发布到另一个域bar.com.如果bar.com启用了CORS(其标题生成Access-Control-Allow-Origin foo.com),则页面X现在可以将数据发送到bar.com.

据我所知,让CORS工作就是关于在bar.com上设置,而与foo.com无关.这一切都是为了确保bar.com不接受来自任何旧域的请求.

然而,这对我来说真的没有意义.我认为CORS的目的是让foo.com能够决定允许哪些X与之通信.如果我们回到前面的例子,但这次X被狡猾的脚本破坏,以便它秘密地向evil.com发送数据,CORS将如何阻止它?evil.com启用了CORS,并设置为*,因此它将接受来自任何内容的请求.这样一来,用户认为他们使用网站foo.com,就会无意中将数据发送到evil.com.

如果它真的是关于bar.com保护自己的,那么为什么它会让浏览器执行该策略呢?唯一可以想象的情况是,如果你让evil.com服务于冒充foo.com的页面Y,那就试图将数据发送到bar.com.但是CORS是由浏览器强制执行的,你所要做的就是让evil.com成为一个将伪造的原始请求发送到bar.com的代理(数据从Y发送到evil.com,evil.com将其假的来源设置为foo .com然后将其发送到bar.com).

如果它以相反的方式工作,那对我来说才有意义.foo.com启用了CORS,其标头设置为Access-Control-Allow-Origin bar.com.这样,胭脂脚本将被浏览器拒绝访问evil.com.然后,浏览器强制执行策略是有意义的,因为它运行的脚本可能会变成胭脂.它不会阻止胭脂网站尝试将胭脂数据发送到bar.com,但bar.com可以使用用户名/密码保护自己.如果foo.com的端点是期望从X返回数据,那么您可以将令牌嵌入X中,以确保evil.com不会向其发送数据.

我觉得我在这里不了解一些根本重要的东西.真的很感激帮助.

T.J*_*der 5

然而,这对我来说真的没有意义。我认为 CORS 旨在使 foo.com 能够决定允许 X 与谁通信。

不,这是关于bar.com控制其内容的使用。

但是 CORS 是由浏览器强制执行的,您所要做的就是让 evil.com 成为向 bar.com 发送伪造源请求的代理...

是的。如果您这样做了,并且 bar.com 上的人会注意到并关心,他们将禁止来自您的服务器的请求。你移动它,他们不允许新的。打地鼠时间。但是,尽管打地鼠游戏很痛苦,但与直接来自foo.com 的每个用户的桌面上的请求相比,它的痛苦要小得多。

让 foo.com 强制执行 foo.com 可以做的事情没有任何意义。foo.com已经强制执行 foo.com 可以做什么,因为它是 foo.com 提供 foo.com 的内容和脚本。