我试图理解为什么不允许没有凭据的跨域请求(默认情况下,没有设置服务器以返回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://stackoverflow.com”访问。
因此,服务器必须发送适当的标头(例如Access-Control-Allow-Origin:*),此请求才能正常工作。
这只是一个简单的请求,不会发送任何cookie。这样限制的原因是什么?如果允许此类CORS,可能会发生什么安全问题?
没有凭据-没有cookie:XMLHTTPRequest的默认设置为withCredentials = false
,因此在请求-link中不发送任何cookie。
我将继续从Security.SE的Why is the Access-Control-Allow-Origin header necessary?中大量盗用>
这里主要关注的是基于网络拓扑的访问控制。假设您在家庭网络上运行HTTP服务(实际上,如果路由器本身具有Web界面,几乎可以肯定的话)。我们将此服务称为R
,只有连接到家庭路由器的机器才能使用该服务。
[当您的浏览器访问evil.example.com
时,该站点为您的浏览器提供了一个脚本,告诉它获取R
的内容并将其发送回evil.example.com
。即使没有凭据,这也可能很糟糕,因为这违反了以下假设:本地网络外部的任何人都无法查看本地网络中运行的服务。同源策略阻止了这种情况的发生。如果同源策略仅在涉及凭证时才起作用,则将有可能绕过基于拓扑的保护。
还请考虑一些公共服务允许基于IP地址的访问:
在这里列出的所有情况下,浏览器都可以用作为其提供脚本的任何网站的不知名代理。