一、问题现象:
二、问题原因:
从 Chrome 94 开始,禁止公共非安全上下文(广义上说,不通过 HTTPS 或来自私有 IP 地址的网站)向私有网络发出请求
受影响的请求包括:
从公共网络到私有网络的请求
从专用网络到本地网络的请求
从公共网络到本地网络的请求
chrome版本更新历史:
对应chrome配置:
Block insecure private network requests
官方链接 :
developer.chrome.com/blog/privat...
引入预检声明 :developer.chrome.com/blog/privat...
三、问题定位
1、检查代理
关闭本地所有代理,出现改问题
打开本地代理,改问题消失,可以推测与网络环境有关
2、关闭代理的情况下检查本地配置
本地host文件中配置了域名对应ip,这个ip是私有ip,访问该ip时符合从公共网络到私有网络的请求,被chrome规则拦截
3、问题解决
修改本地host配置
四、判断网站是否受到影响
从 Chrome 98 开始,如果检测到私有网络请求,则会在其前面发送预检请求。如果此预检请求失败,仍会发送最终请求,但会在 DevTools 问题面板中显示警告。
五、类似问题官方推荐解决方案:
解决方案1:
注册弃用试用版
注册弃用试用版,并配置 服务器以Origin-Trial: $token在响应上附加特定于源的标头
缺点:
该方案最多使用到chrmoe102
解决方案2:
启用策略
更新客户端策略重新启用已弃用的功能
缺点:
需要在用户客户端进行操作
解决方案3:
升级为HTTPS
通过 HTTPS 为私有网站提供服务的主要问题是公钥基础设施证书颁发机构 (PKI CA) 仅向具有公共域名的网站提供 TLS 证书。要解决此问题:
- 注册一个公共域名(例如intranet.example)并发布将该域名指向您选择的公共服务器的 DNS 记录。
- 获取 TLS 证书intranet.example。
- 在您的专用网络中,配置 DNS 以解析intranet.example到目标服务器的专用 IP 地址。
- 配置您的私人服务器以将 TLS 证书用于intranet.example. 这允许您的用户访问位于 的私有服务器intranet.example。
优点:
chrome推荐的面向未来的解决方案
缺点:
1、需要申请和购买证书,
2、需要将现有http服务升级至https
解决方案4
反向嵌入
从私有服务器提供应用程序的骨架,然后从公共服务器(例如 CDN)获取其所有子资源(例如脚本或图像)
缺点:
1、需要重新搭建部署的网络环境
2、chrome声明未来可能会改变
解决方案5
CORS 预检请求
developer.chrome.com/blog/privat...
chrome98中专用网络访问的新增功能
为预检请求引入了一对新的请求和响应标头:
- Access-Control-Request-Private-Network: true在所有 PNA 预检请求上设置
- Access-Control-Allow-Private-Network: true必须在所有 PNA 预检响应上设置
无论请求方法和模式如何,都会为所有专用网络请求发送 PNA 的预检请求。它们在cors模式以及no-cors所有其他模式中的请求之前发送。这是因为所有私网请求都可以用于 CSRF 攻击,无论请求模式如何,以及响应内容是否对发起者可用
问题:
预检请求模式目前已被回滚,暂时无法使用
备注:
专用网络请求是目标服务器的 IP 地址比请求发起者获取的 IP 地址更私密的请求。例如,从公共网站 ( example.com) 到私人网站 ( router.local) 的请求,或从私人网站到 localhost 的请求。
图示: