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

原创 精选
系统 浏览器
你是否遇到过这样的问题:以前一个运行得好好的系统,突然在某个时刻(2021年9月21日之后)用户反馈说用不了了。如果你遇到了相同的疑问,那么这篇文章就继续读下去吧。

抛出问题

你是否遇到过这样的问题:以前一个运行得好好的系统,突然在某个时刻(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.

责任编辑:庞桂玉 来源: 之家技术
相关推荐

2010-03-23 10:08:12

2020-03-19 22:29:51

架构师图解HBase

2010-03-30 13:26:12

创新解决方案戴尔

2010-01-04 17:30:06

2016-11-15 13:52:19

2015-11-23 14:12:26

用户来源Growth Hack

2010-01-07 16:20:21

千兆以太网交换机

2018-07-23 12:56:07

微信通信朋友圈

2020-11-06 17:07:04

希捷孙丹

2010-01-11 16:14:29

华为交换机路由器

2011-08-26 10:34:53

2013-07-17 09:12:55

2021-04-27 15:20:41

人工智能机器学习技术

2021-06-15 07:32:59

Cookie和Sess实现跨域

2009-06-14 17:08:14

ibmdwWebSphere

2019-04-10 10:32:16

CORSNginx反向代理

2011-04-19 09:36:37

Chrome OS

2024-05-20 09:28:44

Spring客户端浏览器

2016-11-01 21:51:03

phpjavascript
点赞
收藏

51CTO技术栈公众号