了解AJAX CORS和安全性考虑

我正试图理解为什么CORS工作的方式。

正如我从这篇文章中所学到的 ,当www.a.com的网页向www.b.com发出AJAX请求时,决定是否允许请求的是www.b.com

但是在这样的模型中,客户端究竟保证了什么? 例如,如果黑客成功将XSS脚本注入到我的页面,那么它向他的域发出一个AJAX请求来存储用户数据。 所以黑客的域名肯定会允许这样的请求。

我以为www.a.com应该决定哪些域允许请求。 所以在理论上,在一个标题访问控制,允许来源我想把整个允许的AJAX CORS请求的域名单。

有人可以解释当前的CORS实现处理什么安全问题吗?

正如我从这篇文章中所学到的,当www.a.com网页向www.a.com发出AJAX请求时,决定是否允许请求的是www.b.com

不完全的。 请求未被阻止。

默认情况下, www.a.com上运行的JavaScript禁止访问www.b.com的响应。

CORS允许www.b.com允许从www.a.com获得JavaScript的访问权限。

但是在这样的模型中,客户端究竟保证了什么?

它阻止了www.a.com的作者使用访问这两个站点的用户的浏览器从www.b.com读取数据,并且已经在www.b.com上进行了authentication(因此可以访问数据,公开)。

例如,Alicelogin到Google。 Alice访问使用XMLHttpRequest从gmail.com访问数据的malicious.example例子。 Alice有一个GMail账号,所以这个回复里有一个收件箱里最近收到的邮件列表。 相同的来源策略可以防止malicious.example读取它。

例如,黑客成功将XSS脚本注入到我的页面,然后向他的域发出AJAX请求来存储用户数据。 所以黑客域名肯定会允许这样的请求。

正确。 XSS是一个不同的安全问题,需要从源头(即在www.a.com而不是在浏览器中)解决。

除了@ Quentin的出色答案外 ,还有另外一项技术被称为内容安全策略 ( Content Security Policy) ,它描述了你在做什么。

我以为www.a.com应该决定哪些域允许请求。 所以在理论上,在一个标题访问控制,允许来源我想把整个允许的AJAX CORS请求的域名单。

使用CSP,您可以在您的域名( www.a.com中设置一个标题来限制AJAX请求:

connect-src限制可以连接的源(通过XHR,WebSockets和EventSource)。

所以要使用这个,你可以把这个Content-Security-Policy HTTP头添加到你的HTML响应中:

 Content-Security-Policy: connect-src 'self' 

如果这个头文件在www.a.com的响应中,这将限制对www.a.com AJAX请求:

“自我”匹配当前的来源,但不是其子域名

在这里查看支持的浏览器。