【发布时间】: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://stackoverflow.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 将能够扫描我的内部网络以查找可能不受保护的主机,例如路由器或公司内部网。
标签: javascript xmlhttprequest cors same-origin-policy