了解AJAX CORS和安全注意事项

Ale*_* Dn 19 javascript ajax cross-domain cors

我试图理解为什么CORS正在以它的工作方式工作.

当我从了解到这个职位,当从网页www.a.com使得AJAX请求www.b.com,那么它的www.b.com是决定是否请求应该被允许.

但是在这种模型中客户端的确切安全性是什么?例如,如果黑客成功向我的页面注入XSS脚本,那么它会向其域发出一个AJAX请求来存储用户数据.因此,黑客的域名将允许这样的请求.

我认为www.a.com应决定允许请求的域名.因此理论上,在头文件Access-Control-Allow-Origin中,我想提出允许AJAX CORS请求的域的完整列表.

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

Que*_*tin 25

正如我从这篇文章中了解到的那样,当页面来自www.a.com发出AJAX请求时www.b.com,那www.b.com就是决定是否允许请求.

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

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

CORS允许www.b.comJavaScript允许www.a.com访问响应.

但是在这种模型中客户端的确切安全性是什么?

它阻止作者使用已访问过两个站点且已经过身份验证的用户浏览器www.a.com读取数据(因此可以访问非公开的数据).www.b.comwww.b.com

例如,Alice已登录Google.Alice访问malicious.example使用XMLHttpRequest来访问数据gmail.com.Alice拥有GMail帐户,因此回复中包含收件箱中最新电子邮件的列表.相同的原始政策阻止malicious.example阅读它.

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

正确.XSS是一个不同的安全问题,需要在源代码处理(即在www.a.com浏览器中而不是在浏览器中).


Sil*_*Fox 5

除了@ Quentin的优秀答案之外,还有另一种称为内容安全策略的技术,它描述了您的目标.

我认为www.a.com应决定允许请求的域名.因此理论上,在头文件Access-Control-Allow-Origin中,我想提出允许AJAX CORS请求的域的完整列表.

使用CSP,您可以从域(www.a.com在您的示例中)设置标头以限制AJAX请求:

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

因此,要使用此功能,您可以将此Content-Security-PolicyHTTP标头添加到HTML响应中:

Content-Security-Policy: connect-src 'self'
Run Code Online (Sandbox Code Playgroud)

这将限制AJAX请求,www.a.com如果该标头位于响应中www.a.com:

'self'匹配当前的起源,但不匹配其子域

请参阅此处了解支持的浏