HTTP 等明文协议可能容易受到窃听攻击,攻击者能够读取传输的内容。传输层安全协议 (TLS) 可以加密流量,使攻击者即使捕获到这些数据,也难以利用它们。
不过,攻击者可能会通过强制加密连接使用明文 HTTP 来绕过 TLS。如需解决此问题,您可以使用 HTTP 严格传输安全协议 (HSTS) 响应标头。HSTS 会强制用户浏览器使用 TLS 访问网站,并且不允许其在设定的时间内回退到明文 HTTP。
Lighthouse 审核失败的原因
审核会标记出 HSTS 标头存在的以下问题:
- 如果根本未找到 HSTS 标头。
- 如果缺少其中一条建议的指令(
max-age、includeSubDomains、preload) - 如果
max-age指令的持续时间不足一年(31536000 秒)。 - 如果解析标头时出现语法错误(例如未知指令),则会发生此错误。
配置严格 HSTS 政策
最佳的 HSTS 标头配置如下所示:
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
max-age指令用于指定用户浏览器必须仅使用 TLS 访问网站的时间量(以秒为单位)。一旦时间过去,如果网站未提供 HSTS 标头(或从 HTTP 到 HTTPS 的临时重定向),用户就可以再次通过纯 HTTP 访问该网站。- 设置
includeSubDomains指令会强制在最初发送标头的网页网址的任何子网域上使用该标头。例如,如果google.com发送的 HSTS 标头包含includeSubDomains指令,则会在mail.google.com上强制执行 HSTS 标头。 - 设置
preload指令并将网域提交给 HSTS 预加载服务后,系统会将该网域编译到使用预加载 HSTS 列表的浏览器二进制文件中。不仅 Google Chrome 如此,
推出 HSTS 标头时存在一些风险。在 max-age 指令中设置的时间内,任何需要未加密 HTTP 连接的功能实际上都会失效。如果应用了 preload 指令,时间可能会更长。
为了降低与发布相关的风险,建议采用分阶段方法:
先从较小的
max-age开始,然后仅添加includeSubDomains(不添加preload):max-age=3600; includeSubDomains在冷却期(例如一周)内未报告任何问题后,提高
max-age。例如:max-age=604800; includeSubDomains如果此初始阶段在较长时间内(例如 3 个月)取得成功,则应将相应网站及其子网域添加到 HSTS 预加载列表,并添加
preload指令。max-age=63072000; includeSubDomains; preload