跳到主要内容

什么是浏览器的 Mixed Content 问题

· 阅读需 4 分钟
素明诚
Full stack development

Mixed Content(混合内容)是指在浏览器中访问一个使用 HTTPS(超文本传输安全协议)加载的网页时,该网页包含了一些通过 HTTP(不安全的超文本传输协议)加载的资源。浏览器会将这种情况视为安全风险,因为 HTTP 的资源是不加密的,可能被第三方截获或篡改,从而破坏整个页面的安全性。

为什么 Mixed Content 是问题?

HTTPS 提供了三大关键安全属性

加密 防止数据在传输过程中被第三方监听。

数据完整性 防止数据在传输过程中被篡改。

身份验证 确保与服务器通信的客户端是合法的。

如果在 HTTPS 页面中加载 HTTP 资源

HTTP 资源的数据是未加密的,可能被中间人攻击(如篡改 JavaScript 脚本、图片、CSS)。

这使得原本安全的页面不再完全可信,破坏了 HTTPS 的初衷!。

Mixed Content 的分类

根据加载的 HTTP 资源类型,Mixed Content 被分为两类

Passive Mixed Content(被动混合内容)

这类资源不会直接与页面的其他内容互动。

例如 图片、视频、音频、样式文件(CSS)。

浏览器可能会允许被动混合内容的加载,但会在地址栏或开发者工具中显示警告。

Active Mixed Content(主动混合内容)

这类资源会与页面的其他部分互动,直接影响页面的安全性。

例如 JavaScript 脚本、内联框架(iframe)、AJAX 请求等。

由于这些资源可能会被劫持和篡改,浏览器会直接阻止主动混合内容的加载。

浏览器如何处理 Mixed Content?

不同浏览器的处理方式可能略有不同,但大多数现代浏览器(如 Chrome、Firefox、Edge 等)都会采取以下措施

被动混合内容

浏览器会允许加载这些资源,但会显示安全警告,提示用户当前页面加载了不安全的内容。

主动混合内容

浏览器会完全阻止加载这些资源,防止不安全的内容影响页面的安全性。

通常会在控制台(Console)中看到错误信息,并且不会加载这些不安全的资源。

Mixed Content 的解决方法

要解决 Mixed Content 问题,你需要确保页面上所有资源都通过 HTTPS 加载。以下是几种常见的解决方法

确保所有资源使用 HTTPS

将页面中所有引用的外部资源(如图片、脚本、样式表、iframe 等)都更改为 HTTPS。

如果资源服务器不支持 HTTPS,考虑将资源托管在支持 HTTPS 的服务器上,或联系资源提供方升级其服务。

相对协议使用

你可以使用相对协议来加载资源(即 // 开头的 URL),例如

<script src="//example.com/script.js"></script>

这种方式会自动使用当前页面的协议来加载资源。如果当前页面是 HTTPS,资源也将通过 HTTPS 加载。

将不支持 HTTPS 的资源代理到 HTTPS

如果外部资源不支持 HTTPS,可以考虑将请求代理到你的服务器,通过你的服务器以 HTTPS 加载该资源。

检测和修复

使用浏览器的开发者工具(F12 -> Console 或 Network 标签页)查看哪些资源导致了 Mixed Content 问题。

修复后重新加载页面,确认问题是否解决。

具体的案例分析

假设你有一个通过 HTTPS 加载的网页,但是其中的图片和 JavaScript 资源是通过 HTTP 加载的。可能出现以下情况

图片资源(被动混合内容)

<img src="http://example.com/image.jpg">

浏览器可能会允许图片加载,但会显示安全警告。

JavaScript 资源(主动混合内容)

<script src="http://example.com/script.js"></script>

浏览器会阻止 JavaScript 文件加载,并在控制台显示错误信息,因为 JavaScript 可能会影响页面的安全性。

浏览器显示的错误提示

Chrome

Mixed Content: The page at 'https://example.com' was loaded over HTTPS, but requested an insecure resource 'http://example.com/resource.js'. This request has been blocked; the content must be served over HTTPS.

Firefox

Blocked loading mixed active content "http://example.com/resource.js"
Loading mixed (insecure) display content "http://example.com/image.jpg" on a secure page