Chrome 94新增的跨域策略深层次解读

Posted Jack_Chai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Chrome 94新增的跨域策略深层次解读相关的知识,希望对你有一定的参考价值。

本文出处:http://blog.csdn.net/chaijunkun/article/details/125144802,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。

抛出问题

你是否遇到过这样的问题:以前一个运行得好好的系统,突然在某个时刻(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请求,那么这些家庭中的嵌入式设备就很容易遭到攻击。下面是我总结的一张表格,含义是外网资源采用不同的协议访问内网资源时的组合情况。

外网访问内网httphttps
httpChorme 94禁止Chorme 94禁止
https安全内容加载不安全内容,禁止取跨域策略

其实由此可以联想到现在的智能手机,在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.

以上是关于Chrome 94新增的跨域策略深层次解读的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 94新增的跨域策略深层次解读

Chrome 94新增的跨域策略深层次解读

Chrome 94新增的跨域策略深层次解读

在 Chrome 中未显示 Font Awesome 图标,这是与 MaxCDN 相关的跨域资源共享策略问题

这些年我们处理过的跨域(转)

跨域共享策略 - 在 Chrome 上使用 color-thief.js 加载颜色