使用强大的 HSTS 政策

HTTP 等明文协议可能容易受到窃听攻击,攻击者能够读取传输的内容。传输层安全协议 (TLS) 可以加密流量,使攻击者即使捕获到这些数据,也难以利用它们。

不过,攻击者可能会通过强制加密连接使用明文 HTTP 来绕过 TLS。如需解决此问题,您可以使用 HTTP 严格传输安全协议 (HSTS) 响应标头。HSTS 会强制用户浏览器使用 TLS 访问网站,并且不允许其在设定的时间内回退到明文 HTTP。

Lighthouse 审核失败的原因

Lighthouse 审核警告,指出未找到 HSTS 响应标头。
Lighthouse 报告警告,指出未找到 HSTS 响应标头。

审核会标记出 HSTS 标头存在的以下问题:

  • 如果根本未找到 HSTS 标头。
  • 如果缺少其中一条建议的指令(max-ageincludeSubDomainspreload
  • 如果 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 指令,时间可能会更长。

为了降低与发布相关的风险,建议采用分阶段方法:

  1. 先从较小的 max-age 开始,然后仅添加 includeSubDomains(不添加 preload):

    max-age=3600; includeSubDomains
    
  2. 在冷却期(例如一周)内未报告任何问题后,提高 max-age。例如:

    max-age=604800; includeSubDomains
    
  3. 如果此初始阶段在较长时间内(例如 3 个月)取得成功,则应将相应网站及其子网域添加到 HSTS 预加载列表,并添加 preload 指令。

    max-age=63072000; includeSubDomains; preload