我试图理解为什么不允许没有凭据的跨域请求(默认情况下,没有设置服务器以返回 Access-Control-Allow-Origin 标头)。如果使用凭据请求,则非常简单 - 如果您已登录,则可以代表您在其他网站上执行某些恶意操作,例如在Facebook上。
例如此请求:
xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.google.com');
xhr.send();
产生错误(我在此网站的Chrome控制台中执行了该错误):
XMLHttpRequest无法加载http://www.google.com/。没有 '访问控制允许来源'标题出现在请求的上 资源。起源' http://stackoverflow.com'因此是不允许的 访问。
因此,服务器必须向此请求发送适当的标头(例如 Access-Control-Allow-Origin:* )才能正常工作。
这只是一个简单的请求,不会发送cookie。这种限制的意义是什么? 如果允许这样的CORS,可能会发生什么安全问题?
没有凭据 - 我的意思是不发送cookie。 XMLHTTPRequest的默认设置是withCredentials = false,这意味着请求中不会发送cookie - link。
答案 0 :(得分:8)
我会继续从Security.SE' Why is the Access-Control-Allow-Origin header necessary?
中偷偷偷走这里主要关注的是基于网络拓扑的访问控制。假设您在家庭网络上运行HTTP服务(事实上,如果您的路由器本身具有Web界面,您几乎肯定会这样做)。我们将此服务称为R
,并且连接到家庭路由器的唯一计算机可以访问该服务。
当您的浏览器访问evil.example.com
时,该网站会向您的浏览器提供一个脚本,告诉它抓取R
的内容并将其发送回evil.example.com
。即使没有凭据,这也可能很糟糕,因为它违反了本地网络外没有人可以查看本地网络内运行的服务的假设。同源策略阻止了这种情况的发生。如果同源策略仅在涉及凭证时发挥作用,则可以绕过基于拓扑的保护。
还要考虑一些公共服务允许基于IP地址的访问:
在此处列出的所有情况中,浏览器都可以用作任何为脚本提供服务的网站的不知情代理。