Javascript 跨来源资源共享(CORS)-我是否遗漏了什么?
我在阅读有关的文章,我认为实现既简单又有效 但是,除非我遗漏了什么,否则我认为规范中遗漏了很大一部分。据我所知,是外部站点根据请求的来源(还可以选择包括凭据)决定是否允许访问其资源。这很好 但是,如果页面上的恶意代码想要将用户的敏感信息发布到外部站点,该怎么办?显然,外部站点将对请求进行身份验证。因此,如果我没有遗漏什么,CORS实际上可以更容易地窃取敏感信息 我认为如果原始站点也能提供其页面允许访问的服务器的不可变列表,那就更有意义了 因此,扩展的顺序是:Javascript 跨来源资源共享(CORS)-我是否遗漏了什么?,javascript,ajax,xss,xmlhttprequest,cors,Javascript,Ajax,Xss,Xmlhttprequest,Cors,我在阅读有关的文章,我认为实现既简单又有效 但是,除非我遗漏了什么,否则我认为规范中遗漏了很大一部分。据我所知,是外部站点根据请求的来源(还可以选择包括凭据)决定是否允许访问其资源。这很好 但是,如果页面上的恶意代码想要将用户的敏感信息发布到外部站点,该怎么办?显然,外部站点将对请求进行身份验证。因此,如果我没有遗漏什么,CORS实际上可以更容易地窃取敏感信息 我认为如果原始站点也能提供其页面允许访问的服务器的不可变列表,那就更有意义了 因此,扩展的顺序是: 提供一页可接受的CORS服务器列表(
我还查看了官方的CORS规范(),没有发现任何关于这个问题的内容。在我看来,CORS纯粹是在扩展可能的内容,并试图安全地完成它。我认为这显然是一个保守的举动。在更安全的同时,对其他标签(脚本/图像)制定更严格的跨域策略将破坏大量现有代码,并使采用新技术变得更加困难。希望能采取一些措施来填补这个安全漏洞,但我认为他们首先需要确保这是一个简单的过渡 但是,如果页面上的恶意代码想要将用户的敏感信息发布到外部站点,该怎么办 怎么样?你已经可以不用CORS了。即使回到Netscape 2,您也始终能够通过简单的GET和POST请求将信息传输到任何第三方站点,这些请求是由
form.submit()、new Image
或设置window.location
等界面引起的
如果恶意代码可以访问敏感信息,则您已经完全丢失。
3) 页面希望向恶意网站发出XHR请求-请求在本地被拒绝
为什么一个页面会试图向一个它还没有被列入白名单的站点发出XHR请求
如果您试图防止由于XSS漏洞而注入的恶意脚本的行为,那么您是在试图修复症状,而不是原因。我和David一样担心。
必须逐层构建安全性,源服务器提供的白名单似乎是一个好方法
此外,此白名单可用于弥补现有漏洞(表单、脚本标记等),可以安全地假设提供白名单的服务器旨在避免后台兼容性问题。您的担忧是完全正确的
然而,更令人担忧的是,不需要存在任何恶意代码就可以利用这一点。存在大量基于DOM的跨站点脚本漏洞,使得攻击者能够利用您描述的问题,将恶意JavaScript插入到有漏洞的网页中。问题不仅仅是数据可以发送到哪里,而是数据可以从哪里接收
我在这里更详细地讨论了这一点:
我也查看了该官员,没有发现任何关于这个问题的内容
对。CORS规范正在解决一个完全不同的问题。您错误地认为它会使问题变得更糟—它既不会使问题变得更好,也不会使问题变得更糟,因为一旦恶意脚本在您的页面上运行,它就可以将数据发送到任何地方
不过,好消息是有一个规范可以解决这个问题:The。它允许您指示浏览器限制页面的功能
例如,您可以告诉浏览器不要执行任何内联脚本,这将立即击败许多XSS攻击。或者,按照您在此处的要求,您可以明确地告诉浏览器允许页面联系的域。问题不在于站点可以访问它已经访问过的其他站点资源。问题是域的问题——如果我在公司使用浏览器,而ajax脚本恶意决定试用10.0.0.1(可能是我的网关),它可能可以访问,因为请求现在来自我的计算机(可能是10.0.0.2)
所以解决方案是CORS。我不是说这是最好的,但它解决了这个问题
1) 如果网关无法返回“bobthehacker.com”接受的源标题,则浏览器将拒绝该请求。这将处理旧的或未准备好的服务器
2) 如果网关只允许来自myinternaldomain.com域的项目,它将拒绝“bobthehacker.com”的来源。在简单的CORS情况下,它实际上仍然会返回结果。默认情况下;您甚至可以将服务器配置为不这样做。然后,结果将被丢弃,而不由浏览器加载
3) 最后,即使它会接受某些域,您也可以控制接受和拒绝的头,以使来自这些站点的请求符合特定的形状
注意——ORIGIN和OPTIONS头由请求者控制——显然,创建自己的HTTP请求的人可以在其中放入他们想要的任何内容。然而,现代的CORS兼容浏览器不能做到这一点。这是浏览器的骗局