这是一个非常关键、也最容易被误解的问题。
结论先说清楚👇
👉 “网站支持 HTTPS ≠ 全程安全”
👉 只要有任何一个环节没做到位,仍然可能被“劫持”或“看起来像被劫持”
下面从“真实原因 + 攻击路径”给你拆透。
一、核心原因总览(先建立全局认知)
即使网站有 HTTPS,仍可能被劫持,通常是这 6 类原因:
① 首次访问未强制 HTTPS(可被降级攻击) ② 没启用 HSTS(浏览器不强制走 HTTPS) ③ 页面中混入 HTTP 资源(混合内容) ④ DNS 被劫持(访问了假服务器) ⑤ 终端或路由器被控制(本地劫持) ⑥ 用户忽略证书警告(人为绕过安全)
二、最常见原因(重点讲清)
🔴 1. “第一次访问”仍然可能被降级攻击
即使网站支持 HTTPS,但如果你访问的是:
http://example.com
流程是:
HTTP → 301 跳转 → HTTPS
👉 问题:
在“跳转之前”这一瞬间,可以被攻击者拦截!
攻击效果:
攻击者删除跳转 → 你一直停留在 HTTP → 页面看起来“正常” → 实际已被劫持
👉 这就是为什么:
有 HTTPS 也没用(如果没强制)
🔴 2. 没有启用 HSTS(关键缺陷)
如果网站没有启用 HSTS:
浏览器不会记住“必须 HTTPS”。
👉 结果:
每次访问都有被降级的风险
特别是在公共 WiFi 环境
🔴 3. 混合内容(Mixed Content)
即:
页面是 HTTPS 但里面加载 HTTP 资源
例如:
<script src="http://evil.com/x.js"></script>
👉 后果:
攻击者可以劫持这个 HTTP 资源:
替换 JS → 控制整个页面
👉 这是一种**“绕过 HTTPS”的方式**
🔴 4. DNS 劫持(配合 HTTPS 仍可能出问题)
正常情况下:
👉 HTTPS 可以防 DNS 劫持(因为证书校验)
但现实中:
❗ 情况 A:用户忽略证书警告
浏览器提示:
⚠ 此连接不安全
用户点了“继续访问”:
👉 💥 完全失守
❗ 情况 B:攻击者有“合法证书”
例如:
被攻破的 CA
错误签发证书
企业/杀毒软件安装根证书
👉 攻击者可以:
伪造 HTTPS 网站(仍显示 🔒)
🔴 5. 终端或路由器被劫持(最隐蔽)
如果:
路由器被黑
系统装了恶意软件
浏览器插件作恶
👉 可以直接:
注入代码
替换页面
劫持请求
👉 这种情况下:
HTTPS 也救不了(因为攻击发生在本地)
🔴 6. 企业/杀毒软件“合法中间人”
很多公司或安全软件会:
安装自己的根证书
解密 HTTPS 流量进行检测
流程变成:
你 ⇄ 软件 ⇄ 网站
👉 本质上是:
“被授权的中间人攻击”
三、一个完整“看似 HTTPS 仍被劫持”的真实链路
用户访问 example.com ↓ HTTP(首次访问) ↓ ⚠ 被降级攻击(停在 HTTP) ↓ 加载页面(看起来正常) ↓ 页面中有 HTTP JS ↓ ⚠ JS 被劫持 ↓ 网页被控制 / 跳转 / 注入广告
👉 用户感觉:
“这个网站明明有 HTTPS,为什么还被劫持?”
四、关键认知纠正(非常重要)
❌ 误区
👉 “只要有 HTTPS 就绝对安全”
✅ 真相
👉 HTTPS 只保护:
已建立的 HTTPS 连接
但不保护:
建立之前(可被降级)
建立之外(DNS、本地环境)
被人为绕过(点继续访问)
五、如何真正做到“不会被劫持”?
✅ 网站侧(必须做到)
强制 HTTPS(301 + 全站)
启用 HSTS(含 preload)
禁止混合内容
正确配置证书
使用 DNSSEC(防 DNS 劫持)
✅ 用户侧(你能控制的)
只访问带 🔒 的网站
不忽略证书警告
使用 DoH(加密 DNS)
避免公共 WiFi / 使用 VPN
定期检查路由器
六、一句话总结(核心本质)
👉 HTTPS 不是“防劫持万能盾”,而是“安全通信通道”
👉 真正问题在于:
很多攻击发生在 HTTPS 生效之前,或绕过 HTTPS 本身