HTTP 降级与混合内容风险
了解攻击者如何利用 HTTP 后备机制,以及混合内容为何会破坏安全保证
HTTP 降级与混合内容风险 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
HTTP 严格传输安全
HTTP 严格传输安全(HSTS)标头会指示浏览器在指定期限内仅通过 HTTPS 连接到网站。收到该标头后,浏览器会拒绝 HTTP 连接,并自动将 http:// URL 升级为 https://。
典型的 HSTS 标头为:“Strict-Transport-Security: max-age=31536000; includeSubDomains; preload”。max-age 的单位是秒(31536000 = 1 年)。缓存该标头后,浏览器会在一年内强制使用 HTTPS,无需服务器参与。
HSTS 的 max-age 与 includeSubDomains
max-age 参数以秒为单位设置浏览器强制执行仅使用 HTTPS 连接的时长。对于生产网站,建议至少设置为一年(31536000)。
includeSubDomains 指令会将 HSTS 强制范围扩展到所有子域名。这样可以防止攻击者将子域名连接降级为 HTTP,并利用主域名上未设置 Secure 标志的 Cookie 窃取信息。
HSTS 预加载列表
浏览器内置了一个硬编码的域名列表,其中的域名始终只能使用 HTTPS,即使用户是第一次访问。这份由 hstspreload.org 维护的列表包含数千个主要网站。
预加载消除了首次访问漏洞:如果没有预加载,首次访问者可能会在收到 HSTS 标头之前遭到拦截。无论 HSTS 缓存状态如何,已预加载的网站从第一个请求开始就只能使用 HTTPS。
SSL 剥离攻击
SSL 剥离由 Moxie Marlinspike 于 2009 年在 Black Hat 上公布,是一种将 HTTPS 连接降级为 HTTP 的 MITM 攻击。攻击者会拦截用户最初的 HTTP 请求,代表用户向真实服务器发出 HTTPS 请求,然后通过 HTTP 将内容转发给用户。
受害者看到的内容看起来正常,但连接实际使用的是 HTTP。用户输入的任何凭据都会发送给攻击者。在 HSTS 出现之前,这种攻击非常有效,因为用户通常不会注意到锁形图标消失了。
HSTS 可抵御 SSL 剥离
HSTS 可以抵御 SSL 剥离,因为浏览器会拒绝连接到已纳入 HSTS 的域名时所使用的 HTTP 连接。即使攻击者试图通过 HTTP 提供页面,浏览器也会直接拒绝连接并显示错误。
浏览器会在发出任何网络请求之前执行 HSTS 强制策略,因此攻击者无法干预。唯一剩下的漏洞是浏览器收到 HSTS 之前的首次访问,而预加载可以消除这一漏洞。
主动混合内容与被动混合内容
当 HTTPS 页面通过 HTTP 加载资源时,就会出现混合内容。被动混合内容包括通过 HTTP 加载的图像、音频和视频。它们无法直接修改页面,但可能通过 HTTP 标头泄露用户信息,并允许进行跟踪。
主动混合内容包括通过 HTTP 加载的脚本、样式表、iframe 和 XMLHttpRequests。HTTP 脚本可以完全破坏 HTTPS 页面的安全性,因为它拥有完整的 DOM 访问权限,并且可以读取 Cookie 和表单数据。
浏览器对混合内容脚本的阻止
当外层页面使用 HTTPS 时,现代浏览器默认会阻止主动混合内容(通过 HTTP 加载的脚本、样式表和 iframe)。控制台会显示错误,并且不会加载该资源。
从 Chrome 81(2020 年)开始,浏览器会自动将被动混合内容升级为 HTTPS。如果 HTTPS 版本存在,浏览器就会加载它;如果不存在,则会阻止该资源。
浏览器 DevTools 中的混合内容
浏览器的开发者控制台会显示混合内容警告和错误。在 Chrome 中,请打开 DevTools,进入“控制台”标签页,然后按“混合内容”进行筛选。每个被阻止的资源都会显示需要更新的不安全 URL。
DevTools 中的“安全”面板会显示全面的安全概览,包括证书详细信息、连接信息,以及页面上所有不安全资源的列表。
upgrade-insecure-requests CSP 指令
内容安全策略(CSP)指令“upgrade-insecure-requests”会指示浏览器将页面发出的所有 HTTP 请求自动升级为 HTTPS。它可以处理包含硬编码 HTTP URL 的旧内容。
与阻止混合内容不同,upgrade-insecure-requests 会先尝试获取 HTTPS 版本。在从 HTTP 迁移到 HTTPS 的过程中,如果更新旧内容中的所有嵌入式 URL 不切实际,这项指令就非常有用。
HTTP 上的 ISP 广告注入
如果没有 HTTPS,ISP 就可以向 HTTP 响应中注入内容。一些 ISP 曾被发现向原本没有广告的网页中注入广告、添加跟踪像素,或在用户接近流量上限时注入警告页面。
HTTPS 页面不可能遭受这种形式的内容注入,因为响应经过身份验证和加密。任何修改都会导致 TLS MAC 验证失败,结果是连接错误,而不是向用户提供被修改的内容。
首次通过 HTTP 访问为何仍然存在风险
在浏览器看到某个域名的 HSTS 标头之前,第一次通过 HTTP 访问时非常容易受到攻击。攻击者可以拦截这个初始请求并执行 SSL 剥离,而不会触发任何浏览器警告。
这种“首次使用时信任”漏洞正是 HSTS 预加载列表存在的原因。将网站提交到预加载列表后,浏览器会从第一个请求开始对该域名强制使用 HTTPS,从而彻底关闭首次访问窗口。
HSTS 测验
请测试您对 HTTP 严格传输安全的理解。
要点总结:HSTS 与混合内容
HSTS 会指示浏览器在指定期限内对某个域名强制使用仅 HTTPS 的连接。预加载列表通过在浏览器中硬编码 HSTS 策略,将保护范围扩展到首次访问。
SSL 剥离攻击(Moxie Marlinspike,2009 年)会将 HTTPS 降级为 HTTP;HSTS 可以抵御这种攻击。浏览器会阻止主动混合内容(HTTPS 页面中的 HTTP 脚本)。upgrade-insecure-requests CSP 指令可以自动完成旧内容从 HTTP 到 HTTPS 的迁移。
常见问题解答
「HTTP 降级与混合内容风险」课时是免费的吗?
是的 — 「HTTP 降级与混合内容风险」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「HTTP 降级与混合内容风险」这节课中我会学到什么?
了解攻击者如何利用 HTTP 后备机制,以及混合内容为何会破坏安全保证 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「HTTP 降级与混合内容风险」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 挂锁图标:它真正代表什么
- 网站如何获得 SSL 证书
- TLS 证书警告与应对方法
- HTTP 降级与混合内容风险