为啥禁止没有凭据的 CORS?

Posted

技术标签:

【中文标题】为啥禁止没有凭据的 CORS?【英文标题】:Why is CORS without credentials forbidden?为什么禁止没有凭据的 CORS? 【发布时间】:2014-12-06 00:23:36 【问题描述】:

我试图理解为什么不允许没有凭据的跨域请求(默认情况下,没有设置服务器来返回 Access-Control-Allow-Origin 标头)。当请求具有凭据时,一切都非常简单 - 如果您已登录,则可以代表您在其他网站上执行一些恶意操作,例如在 Facebook 上。

例如请求

xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.google.com');
xhr.send();

产生错误(我从这个站点在 Chrome 的控制台中执行它):

XMLHttpRequest 无法加载 http://www.google.com/。不 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://***.com” 访问。

因此,服务器必须发送适当的标头(例如 Access-Control-Allow-Origin: * )才能使该请求起作用。

这只是一个简单的请求,不会发送任何 cookie。这种限制的原因是什么?如果允许此类 CORS,可能会出现哪些安全问题?

没有凭据 - 没有 cookie: XMLHTTPRequest 的默认设置是withCredentials = false,因此请求中不会发送任何cookie - link。

【问题讨论】:

很确定这根本不是他要问的。我将其解释为他知道策略是什么,但试图了解它在没有发送凭据时保护客户端免受什么影响。 @KevinB 是的,你是对的,我试图了解在没有任何 cookie 的情况下,客户端在此类请求中的风险。 Security.SE 上有用的相关(相同?)问题:Why is the Access-Control-Allow-Origin header necessary? -- “...我看不出不允许未经认证的跨域 AJAX 请求的目的是什么Access-Control-Allow-Origin 标头。” tldr,它会阻止站点 a.com 访问站点 b.com,因为 a.com 和 b.com 具有不同的主机值,因此该站点只能在我的专用网络中访问。如果允许,a.com 将能够扫描我的内部网络以查找可能不受保护的主机,例如路由器或公司内部网。 【参考方案1】:

我会继续从 Security.SE 的 Why is the Access-Control-Allow-Origin header necessary? 大量窃取信息

这里主要关注的是基于网络拓扑的访问控制。假设您在家庭网络上运行 HTTP 服务(事实上,如果您的路由器本身具有 Web 界面,您几乎肯定会这样做)。我们将此服务称为R,只有连接到您家庭路由器的机器才能使用该服务。

当您的浏览器访问evil.example.com 时,该站点会为您的浏览器提供一个脚本,告诉它获取R 的内容并将其发送回evil.example.com。即使没有凭据,这也可能很糟糕,因为这违反了本地网络之外的任何人都无法查看本地网络内运行的服务的假设。同源策略阻止了这种情况的发生。如果同源策略仅在涉及凭据时发挥作用,则可能会绕过基于拓扑的保护。

还要考虑一些公共服务允许基于 IP 地址的访问:

牛津英语词典将其在线条目的访问权限限制为来自订阅大学的 IP 地址 英国将 BBC 内容的访问权限限制在国内的 IP 地址内

在此处列出的所有情况下,浏览器都可能被用作任何为其提供脚本的网站的不知情代理。

【讨论】:

以上是关于为啥禁止没有凭据的 CORS?的主要内容,如果未能解决你的问题,请参考以下文章

403 - 禁止访问: 访问被拒绝。您无权使用所提供的凭据查看此目录或页面。 怎么解决 ?

403 禁止 - Nginx - 使用正确的凭据

403 使用有效的用户凭据访问 Leycloak REST API 时被禁止

禁止chrome中CORS跨域资源共享错误

在javascript中使用xmlhttprequest“CORS问题-403禁止”[重复]

Tomcat CORS:预检成功,但实际请求失败,403 被禁止