当前位置:首页 > 休闲

网址被一个不受信任的站点引用

浏览器地址栏左边那个灰色小锁图标突然多了一道红色斜杠,网址点开一看——“网址被一个不受信任的被个不受站点引用”。这事我上周刚遇到过,信任当时正帮朋友排查他公司官网的站点引加载问题。页面本身能打开,网址但控制台里一堆混合内容警告,被个不受HTTPS 页面里嵌了 HTTP 的信任图片和脚本。朋友挠头说:“图片都存自己服务器上,站点引怎么会不受信任?网址”我让他把那张图的地址复制出来,果然,被个不受图片链接写的信任是 http:// 开头,而页面是站点引 https://。浏览器不傻,网址它认为这个 HTTPS 页面里混进了不安全的被个不受资源,于是信任把整个页面的安全状态标记为“不受信任”。

这行提示的真正含义,不是你的网址被人盗用了,而是你正在访问的页面里,有某个资源来自一个没有通过 HTTPS 加密的站点。浏览器把那个资源所在的域名视为“不受信任的站点”,然后它“引用”了当前页面——也就是当前页面加载了它。反过来,如果别人网站用 HTTP 引用了你的 HTTPS 资源,你的服务器日志里也会出现类似的 referer 警告,只不过提示文案不同。

我见过最典型的情况是 CDN 配置错误。某电商网站把主站升级到 HTTPS,但商品详情页的缩略图仍然指向旧的 HTTP 图片服务器。用户打开页面,图片能显示,因为浏览器允许混合内容中的图片加载(脚本和 iframe 会被直接拦截),但地址栏会显示“不安全”或“部分加密”。Chrome 从 81 版本开始,混合图片也会被自动升级到 HTTPS 尝试加载,如果那个 HTTP 服务器不支持 HTTPS,图片就裂了,控制台报错“Mixed Content: The page at ‘https://...’ was loaded over HTTPS, but requested an insecure image ‘http://...’. This request has been blocked.” 用户看到的是图片加载失败,开发者看到的是“不受信任的站点引用”。

还有一种情况更隐蔽:第三方统计脚本。很多站长喜欢从某个免费统计服务商那里复制一段 JS 代码,那段代码的 src 写的是 http:// 开头。页面本身是 HTTPS,这段脚本一加载,浏览器直接拦截,统计功能失效。站长打开控制台,看到“网址被一个不受信任的站点引用”的警告,还以为是自己的域名被标记了。其实只要把那段脚本的 http:// 改成 https:// 或者 //,问题就没了。

我自己的博客也踩过这个坑。去年换服务器,忘了给子域名 sub.example.com 申请 SSL 证书,主站是 HTTPS,但子域名上的字体文件还是 HTTP 的。结果每个访问主站的人都会在控制台看到字体加载失败,地址栏安全状态降级。后来我给子域名也上了 Let‘s Encrypt 证书,警告消失。这件事让我意识到,HTTPS 不是主站一个人的事,你引用的每一个资源,只要跨了域名,那个域名也得是 HTTPS。

浏览器为什么这么较真?因为 HTTPS 页面里混入 HTTP 资源,等于给攻击者留了后门。HTTP 资源在传输过程中可以被中间人篡改,比如把一张图片替换成恶意脚本,或者把统计脚本改成窃取 cookie 的代码。浏览器无法判断那个 HTTP 资源是否被篡改过,所以干脆把整个页面的安全状态降级,提醒用户“这个页面不完全可信”。

解决起来不复杂。打开开发者工具,切到 Network 面板,按 Protocol 列排序,把所有 http:// 开头的请求找出来。图片、脚本、样式、字体、iframe,一个都别放过。要么把资源迁移到 HTTPS 服务器,要么用协议相对地址 //example.com/asset.js,要么直接改用 HTTPS 的 CDN。如果资源来自第三方,联系对方问有没有 HTTPS 版本。实在找不到 HTTPS 源,就把那个资源下载到自己服务器上,用自己的 HTTPS 域名引用。

有个细节值得留意:有些老旧的内网系统,只在局域网里用 HTTP,但员工从外网通过 HTTPS 访问时,页面里嵌了内网 HTTP 的图片,照样触发警告。这种场景下,要么把内网资源也套一层 HTTPS 反向代理,要么干脆别在 HTTPS 页面里引用内网 HTTP 资源。浏览器不管你是不是内网,它只认协议。

下次再看到“网址被一个不受信任的站点引用”,别急着怀疑自己的域名被黑。打开控制台,看看是哪个 http:// 开头的家伙在捣乱。把它揪出来,换成 HTTPS,地址栏的小锁就回来了。

分享到: