世界今头条!Chrome 94新增的跨域策略深层次解读
2022-08-17 15:59:59来源:之家技术
你是否遇到过这样的问题:以前一个运行得好好的系统,突然在某个时刻(2021年9月21日之后)用户反馈说用不了了。如果用户允许你F12进行网络交互或者控制台输出查看时,你会发现这样的错误:
【资料图】
Access to XMLHttpRequest at "http://[some_url]" from origin "http://[some_url]" has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address space "private".
然后请求就中断了,后续的逻辑自然也就没办法进行了。乍一看是跨域策略(CORS policy)的问题,赶紧去看看接口的Response Header与跨域相关的配置:
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With, Content-Range, Content-Type
Access-Control-Expose-Headers: Range
和跨域相关的配置也都返回了(要不然以前的系统也不能正常地运行),怎么突然就报错了呢?如果你遇到了相同的疑问,那么这篇文章就继续读下去吧。
复现问题首先,你操作的业务系统,其域名一定指向的是一个公网IP地址。这里我们假设名为"out.com";
其次,在上述业务系统中调用了另外一个系统的接口,该子系统域名指向的是一个内网IP(无论A类B类还是C类子网)地址(localhost, 127.*.*.*, [::1]除外)。这里我们假设名为“in.com”。
最后,一定是上述两个系统都采用http协议进行访问。
举个例子*:
ping out.com
来自110.242.68.66 的回复: 字节=32 时间=12ms TTL=48
ping in.com
来自10.29.10.136 的回复: 字节=32 时间=12ms TTL=48
操作页面:http://out.com/article/process,在该页面中有如下JS:
$.ajax({url:"http://in.com/api/auditors", method:"GET", success:function(ret) {}})
那么此时就会复现文章开头描述的问题。
*注:以上数据经过脱敏处理,所涉及域名和IP地址并非真实数据,仅供内容阐述之用。
问题原因为什么升级到Chrome 94开始就有问题了呢?在这一版中,它禁止了公共非安全上下文(广义上说,不通过 HTTPS 或来自私有 IP 地址的网站)向私有网络发出请求。听起来很难理解。让我们抽出这句话的关键词:公共上下文/ 请求/ 私有网络。
这里不得不聊一下现在的网络应用背景。越来越多的家庭出现了嵌入式设备。而这些设备的安全性普遍都不是很高。仅仅提供一个简单的http配置界面给用户。如果访问了一个外网别有用心的网页,里面被嵌入了一个内网的ajax请求,那么这些家庭中的嵌入式设备就很容易遭到攻击。下面是我总结的一张表格,含义是外网资源采用不同的协议访问内网资源时的组合情况。
外网访问内网 | http | https |
http | Chorme 94禁止 | Chorme 94禁止 |
https | 安全内容加载不安全内容,禁止 | 取跨域策略 |
这里可以给大家举个例子。部分型号的TP-Link路由器,为了方便用户进行配置,只要连接上(通过有线或者无线),浏览器输入:tplogin.cn就可以自动打开管理界面(域名自动解析到默认网关)。在Chrome 94之前,当用户打开了一个“精心设计”的http页面,内部编写了一套针对tplogin.cn的攻击JS。那么处于内网的路由器就有被侵入的风险。
其实由此可以联想到现在的智能手机,在iOS中,如果应用需要网络权限,用户可以选择蜂窝和无线网络,而无线网络又可以选择是否允许访问本地网络。此功能与Chrome本次的跨域策略升级其实是基于同样的考量。
解决方法方案一:同时升级外部系统和内部系统,都采用https协议访问;
方案二:如果你有权限控制外部系统,让外部系统在公司内网中也解析为内网地址。
如果你不得不采用http方式访问(例如:没有对应的https证书),那么用户可以在浏览器中禁用掉这一策略。在chrome中打开此地址:
chrome://flags/#block-insecure-private-network-requests
将Block insecure private network requests配置禁用掉(Disable)。但是一定要注意,修改了配置后必须点击Chrome此时在右下角出现的“重启”(Restart)按钮才能生效。自己主动关闭浏览器全部页面再打开是不会触发Chrome更新配置的。
参考文献
[1]Titouan Rigoudy,Private Network Access update: Introducing a deprecation trial
[EB/OL].https://developer.chrome.com/blog/private-network-access-update/,2022-02-10.