【网络安全】Chrome 94 CORS private adress 问题
在 CodeReview 时候,发现请求报错,还以为后端环境又坏了(调试环境-囧),查了下页面报错如下这段英文表示 “因为违反了跨域策略所以请求被阻止了,因为这次请求不是 https 的,并且请求的地址是 private 的”原来不是环境问题,是被 chrome 阻止了请求报错的产生总结:上面错误提示中说了 CORS “跨域请求”,在 94 版本后,使用跨域请求需要满足两个条件之一即可那为什么要这
起因
在 CodeReview 时候,发现请求报错,还以为后端环境又坏了(调试环境-囧),查了下页面报错如下
Access to XMLHttpRequest at ‘10.120.xxx’ from origin ‘http://xxx’ has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address space
private
.
这段英文表示 “因为违反了跨域策略所以请求被阻止了,因为这次请求不是 https 的,并且请求的地址是 private 的”原来不是环境问题,是被 chrome 阻止了
请求报错的产生总结:
- CORS 跨域请求
- 更新到 Chrome 94 版本以上
- 请求了不安全的 http 的内网 ip 地址
Chrome 94 更新
上面错误提示中说了 CORS “跨域请求”,在 94 版本后,使用跨域请求需要满足两个条件之一即可
- 也就是 https 的请求
- 非 private 的 http 请求
那为什么要这样做呢?我们先查阅下 Chrome 的更新记录
google chrome 历史版本更新日志en.wikipedia.org/wiki/Google…
从图中看到新增了 “Restriction of private network requests for subresources to secure contexts” 也就是 “限制针对私有网络的资源请求”
谷歌的开发者解释了加入这层限制的原理 developer.chrome.com/blog/privat…
从这篇文章中,终于了解到了本次更新的原因。针对于 private network,加入了 W3C deprecation 的试用草案
该草案描述了 private network 的访问条件。草案的目的是为了防止 CSRF 攻击,
CSRF 私有网络攻击
谷歌开发者的文中声称,有数十万人遭受了针对私有网络的 CSRF 攻击。从这里看到,Chrome 多次提示了 private network 私有网络。那什么是私有网络攻击呢?简单说,就是你打开一个公共的网站,这个网站里会去请求你内网里的地址(例如192.168.1.3/xx),在以前是可以被允许的,但是这带来了隐患,假设你们公司内网有个网站提供了机密信息,现在就会恶意访问到。
sequenceDiagram
企业员工A->>公共网站: 打开
公共网站->>企业内网: 请求192.168.1.3/xx
企业内网->>公共网站: 企业机密信息被窃取了
实际测试
假设有一 internal.com 和 internal.com 的域名对应于内网IP 10.x.x.x
页面协议 | 页面内的请求协议 | 示例 | 结果 |
---|---|---|---|
http | http | 页面是www.xx.com 其中ajax请求是 internal.com | 失败 |
http | https | 页面是www.xx.com 其中ajax请求是 internal.com | 成功 |
https | https | 页面是www.xx.com 其中ajax请求是 internal.com | 成功 |
也就是说,如果 ajax 的地址是内网的 IP,此时必须是 https 才可以,http 的就会失败
原理剖析
参考 wicg.github.io/private-net…
地址块 | 姓名 | 参考 | 地址空间 |
---|---|---|---|
127.0.0.0/8 | IPv4 环回 | [RFC1122] | 当地的 |
10.0.0.0/8 | 私人使用 | [RFC1918] | 私人的 |
172.16.0.0/12 | 私人使用 | [RFC1918] | 私人的 |
192.168.0.0/16 | 私人使用 | [RFC1918] | 私人的 |
169.254.0.0/16 | 链接本地 | [RFC3927] | 私人的 |
::1/128 | IPv6 环回 | [RFC4291] | 当地的 |
fc00::/7 | 独特的地方 | [RFC4193] | 私人的 |
fe80::/10 | 链路本地单播 | [RFC4291] | 私人的 |
::ffff:0:0/96 | IPv4 映射 | [RFC4291] | 查看映射的 IPv4 地址 |
这些地址都会认为是私有地址,当 Chrome 解析到请求是这些私有地址的时候,就会禁止
解决方案
方案1 关闭检查
打开浏览器,进入chrome://flags/页面搜索Block insecure private network requests设置为Disabled,Relaunch就好了
方案2 使用 https
给内网地址映射一个 https 的地址
更多推荐
所有评论(0)