了解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请求:
“自我”匹配当前的来源,但不是其子域名
在这里查看支持的浏览器。