为什么CORS没有凭证被禁止?

Vas*_*ily 4 javascript xmlhttprequest same-origin-policy cors

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

例如这个请求:

xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.google.com');
xhr.send();
Run Code Online (Sandbox Code Playgroud)

产生错误(我在Chrome网站的控制台中执行此错误):

XMLHttpRequest无法加载http://www.google.com/.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此,不允许来源" http://stackoverflow.com "访问.

因此,服务器必须向此请求发送适当的头(例如Access-Control-Allow-Origin:*)才能正常工作.

这只是一个简单的请求,不会发送cookie.什么是这种限制的意义?如果允许这样的CORS,可能会发生什么安全问题?

没有凭据 - 我的意思是不发送cookie.XMLHTTPRequest的默认设置是withCredentials = false,这意味着在请求 - 链接中没有发送cookie .

aps*_*ers 8

我将继续并从Security.SE中自由窃取为什么需要Access-Control-Allow-Origin标头?

这里主要关注的是基于网络拓扑的访问控制.假设您在家庭网络上运行HTTP服务(事实上,如果您的路由器本身具有Web界面,您几乎肯定会这样做).我们将调用此服务R,并且连接到家庭路由器的唯一计算机可以访问该服务.

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

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

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

在此处列出的所有情况中,浏览器都可以用作任何为脚本提供服务的站点的不知情代理.