使用强大的 HSTS 政策

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

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

Browser Support

  • Chrome: 4.
  • Edge: 12.
  • Firefox: 4.
  • Safari: 7.

Source

Lighthouse 审核失败的原因

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