了解 AJAX CORS 和安全注意事项
Posted
技术标签:
【中文标题】了解 AJAX CORS 和安全注意事项【英文标题】:Understanding AJAX CORS and security considerations 【发布时间】:2014-03-18 06:00:39 【问题描述】:我试图理解为什么 CORS 以它的工作方式工作。
我从this post 了解到,当来自 www.a.com 的页面向 www.b.com 发出 AJAX 请求时,它就是 www .b.com 决定是否允许请求。
但是,在这种模型中,客户端究竟得到了什么保护? 例如,如果黑客成功对我的页面进行 XSS 脚本注入,那么它会向他的域发出 AJAX 请求以存储用户数据。因此,黑客的域肯定会允许这样的请求。
我认为 www.a.com 应该决定允许请求到哪些域。所以理论上在标题 Access-Control-Allow-Origin 中,我想把允许 AJAX CORS 请求的域的整个列表。
谁能解释当前的 CORS 实现处理哪些安全问题?
【问题讨论】:
是的,没错,提供数据的域( saas )可以列出它的“允许”域。 (ACAO)之后,SaaS 有责任确保请求是安全的(通过常规的“网络服务器”手段 - 字符串清理、捕获 DSA 等) 【参考方案1】:正如我从这篇文章中了解到的,当来自
www.a.com
的页面向www.b.com
发出AJAX 请求时,则由www.b.com
决定是否允许请求。
不完全是。请求未被阻止(至少,如果它是simple)。
默认情况下,www.a.com
上运行的 javascript 被禁止访问来自 www.b.com
的响应。
CORS 允许 www.b.com
授予 www.a.com
上的 JavaScript 访问响应的权限。
但是在这样的模型中,客户端的安全性究竟是什么?
它阻止www.a.com
的作者使用访问过这两个站点并已在www.b.com
上进行身份验证的用户的浏览器从www.b.com
读取数据(因此可以访问不公开的数据) .
例如,Alice 已登录 Google。 Alice 访问malicious.example
,它使用 XMLHttpRequest 访问来自gmail.com
的数据。 Alice 有一个 GMail 帐户,因此在她的收件箱中回复了一份最新电子邮件列表。同源策略阻止malicious.example
读取它。
例如,黑客成功将 XSS 脚本注入到我的页面,然后向他的域发出 AJAX 请求以存储用户数据。所以黑客域肯定会允许这样的请求。
正确。 XSS 是一个不同的安全问题,需要从源头(即www.a.com
而不是浏览器)解决。
【讨论】:
【参考方案2】:除了@Quentin's excellent answer,还有一种称为Content Security Policy 的技术描述了您的目标。
我认为 www.a.com 应该决定允许请求到哪些域。因此,理论上,在标头 Access-Control-Allow-Origin 中,我想将允许 AJAX CORS 请求的域的整个列表放入。
使用 CSP,您可以设置域中的标头(在您的示例中为 www.a.com
)来限制 AJAX 请求:
connect-src 限制您可以连接的来源(通过 XHR、WebSockets 和 EventSource)。
因此,要使用它,您可以将此 Content-Security-Policy
HTTP 标头添加到您的 html 响应中:
Content-Security-Policy: connect-src 'self'
这会将 AJAX 请求限制为 www.a.com
,如果该标头在来自 www.a.com
的响应中:
'self' 匹配当前来源,但不匹配其子域
See here 用于支持的浏览器。
【讨论】:
以上是关于了解 AJAX CORS 和安全注意事项的主要内容,如果未能解决你的问题,请参考以下文章
WeX5 - AJAX跨域调用相关知识-CORS和JSONP
(Jquery、Ajax、Django、Cors、GET)没有“Access-Control-Allow-Origin”标头 - 忽略 Cors 白名单