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

Chrome 94 开始禁止公共非安全上下文向私有网络发出请求,导致原本正常运行的系统出现跨域错误。问题出现在http协议的外部系统尝试访问内网IP的子系统时。解决方法包括升级所有系统至https或调整外部系统在内网的解析。此外,用户可在浏览器中临时禁用相关安全策略。

本文出处:http://blog.youkuaiyun.com/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安全内容加载不安全内容,禁止取跨域策略

这里可以给大家举个例子。部分型号的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.

<think> 我们参考了多个引用,特别是引用[3]和引用[4]提供了具体的操作步骤。用户希望禁用Chrome浏览器的域策略(同源策略),通常是为了本地开发时绕过CORS限制。下面将分别介绍在Mac和Windows系统下的操作步骤,并强调这仅适用于开发环境,因为禁用同源策略会降低浏览器的安全性。 ### Mac系统下的操作步骤 1. **创建一个新的用户数据目录**(用于存储临时用户数据,避免影响正常浏览): - 打开终端(Terminal)。 - 创建一个目录,例如在文档(Documents)文件夹中创建`MyChromeDevUserData`: ```bash mkdir -p ~/Documents/MyChromeDevUserData ``` 2. **创建一个启动脚本**: - 在任意位置(例如在`~/Documents/`下)创建一个名为`chrome-debug.command`的文件。 - 使用文本编辑器(如vim)编辑该文件: ```bash vim ~/Documents/chrome-debug.command ``` - 将以下内容复制到文件中(注意将`xxx`替换为你的用户名): ```bash #!/bin/bash open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --disable-gpu --user-data-dir=/Users/xxx/Documents/MyChromeDevUserData ``` 注意:`/Users/xxx/Documents/MyChromeDevUserData`应替换为你实际创建的目录路径。 3. **赋予执行权限**: - 在终端中运行: ```bash chmod 755 ~/Documents/chrome-debug.command ``` 4. **运行脚本**: - 双击`chrome-debug.command`文件,或者通过终端运行: ```bash ~/Documents/chrome-debug.command ``` - 此时会打开一个新的Chrome浏览器窗口,并显示“您使用的是不受支持的命令行标记:--disable-web-security。稳定性和安全性会有所下降。”的提示,表示安全策略已被禁用。 ### Windows系统下的操作步骤 1. **创建一个新的Chrome快捷方式**: - 在桌面上右键点击,选择“新建”->“快捷方式”。 - 在“请键入对象的位置”中输入以下命令(注意路径可能需要根据实际安装位置调整): ``` "C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --disable-gpu --user-data-dir="C:\chromeTemp" ``` 其中`C:\chromeTemp`是一个临时目录,用于存储用户数据(需要确保该目录存在,如果不存在则先创建)。 2. **运行快捷方式**: - 双击该快捷方式启动Chrome,同样会看到安全提示,表示安全策略已禁用。 ### 注意事项 - **仅用于开发**:禁用同源策略会降低浏览器的安全性,因此只应在开发调试时使用,不要用于日常浏览。 - **每次都需要通过此方式启动**:只有通过上述方式启动的Chrome实例才会禁用域策略。 - **可能的问题**:如果遇到问题(如无法启动),请检查路径是否正确,以及目录是否已创建。 通过以上步骤,用户可以在开发环境中禁用Chrome域策略,方便进行本地调试。 §§相关问题§§ 1. 如何验证Chrome浏览器的域策略是否已成功禁用? 2. 除了禁用同源策略,还有哪些方法可以解决开发时的问题? 3. 禁用域策略后,可能会遇到哪些常见问题?如何解决? </think> 为了在Chrome浏览器中禁用域策略(同源策略),请按照以下步骤操作。**注意**:该方法仅适用于开发环境,会降低浏览器安全性,日常浏览时请使用标准版Chrome。 --- ### 🛠️ 禁用域策略步骤(Mac & Windows) #### **Mac系统** 1. **创建用户数据目录** 终端执行: ```bash mkdir -p ~/Documents/MyChromeDevUserData ``` 2. **创建启动脚本** 新建文件 `chrome-debug.command`,内容如下(替换`xxx`为你的用户名): ```bash #!/bin/bash open -n /Applications/Google\ Chrome.app/ --args \ --disable-web-security \ --disable-gpu \ --user-data-dir=/Users/xxx/Documents/MyChromeDevUserData ``` 3. **授权并运行** ```bash chmod 755 chrome-debug.command # 添加执行权限 ./chrome-debug.command # 运行脚本 ``` #### **Windows系统** 1. **创建快捷方式** - 桌面右键 → **新建** → **快捷方式** - 输入目标位置(注意空格): ``` "C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --disable-gpu --user-data-dir="C:\chromeTemp" ``` > 需预先创建 `C:\chromeTemp` 目录 2. **运行快捷方式** 双击新建的快捷方式,浏览器将显示警告提示(如下图),表示域策略已禁用: ![Chrome禁用提示](https://example.com/chrome-warning.png) *图:安全警告表明域策略已关闭[^3]* --- ### ⚠️ 重要注意事项 1. **仅限开发环境** 禁用同源策略后,浏览器易受恶意脚本攻击,**切勿用于日常浏览或访问敏感网站**[^2]。 2. **解决常见问题** - **脚本无法运行?** → 检查路径是否正确(尤其Mac的用户名和目录) - **仍提示错误?** → 关闭所有Chrome进程后重试 - **Windows报错?** → 以管理员身份运行快捷方式 --- ### 🌐 替代方案(无需禁用) | 方法 | 适用场景 | 操作指引 | |--------------------|--------------------------|----------------------------------| | 后端代理转发 | 生产环境 | 用Nginx/Apache转发API请求 | | 浏览器插件 | 临时测试 | 安装CORS Unblock等扩展 | | 开发服务器配置 | 前端框架(如Vue/React) | 在 `vite.config.js` 中配置代理 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值