在 HSTS header 中 max-age 指令在语义上是否必要?

Is the max-age directive semantically necessary in the HSTS header?

在试图理解 HSTS 机制时,我无法理解 max-age 指令。 HSTS header 的 presence/absence 是否足以告诉浏览器切换到 HTTP 或 HTTPS?

浏览器会“永远”记住一个网站应该在第一次联系时通过 HTTPS 联系,直到 header 在以后的响应中消失。另外,preload 指令也支持浏览器。

我在规范中找不到任何对此进行解释的内容。 https://datatracker.ietf.org/doc/html/rfc6797

我觉得我错过了一些特定场景。这不是批评,我想明白为什么这个指令是必要的。

它允许它逐渐推出。建议先设置一个非常小的max-age,如果没有问题再增长。这避免了 DoS-ing 您自己对任何 non-HTTPS 站点的真正风险。虽然这种情况越来越少,但当它第一次出现时,这是一个真正的风险,因为 HTTP 仍然是非常规范的。

例如,您将其部署在 https://www.example.com and that web server also responds to (and sets the HSTS header on) https://example.com. Now let’s say you haven’t set up HTTPS on http://blog.example.com (it’s an unimportant static only domain) or on http://intranet.example.com(不是 Internet-facing)。如果没有 max-age,您可能会永远阻止这些站点,直到您可以向它们部署 HTTPS(这可能比仅添加一些服务器配置更棘手)。

并且无法访问该站点,浏览器也看不到 header 已因您建议的重置而被删除。另外还有一个事实,并不是每个资源都需要设置 HSTS header - 一个就足够了(尽管最佳实践是在每个 HTTPS 资源上设置它并包括重定向),所以没有 header 不足以重置它。您明确需要设置 max-age=0.

当然,如今,推荐的方法是在所有子域上使用 HTTPS(这几乎已成为常态,因为 public Internet 现在比以前使用 HTTPS 多得多 - 尽管还不是默认的) 以及内部网站(尽管很难确定后者是否真的是大大小小的公司的常态)。

你是对的,这个 可以 已经通过将 max-age 作为可选的(而不是现在的强制性)来实现,并且网站所有者可以将其从HSTS header,一旦准备好完全推出它,但默认的 max-age 无穷大是非常危险的 - 原因与上面给出的相同。没有默认值并让实施者考虑它,希望能让他们考虑合适的,或者至少让他们意识到他们正在做出的承诺。

预加载是使其永久化的方法,此时 max-age 属性对于那些用户代理的实现预加载列表(主要是最流行的浏览器)来说是多余的。

有人认为这个世界上没有什么是永恒的——域名来了又去,被新的各方所接受,他们可能不想使用 HTTPS(至少最初是这样)——尽管正如我所说的 HTTPS 正在成为问题不大的规范。

仅仅因为他们几年前访问过您的网站一次,就用无限策略阻塞浏览器缓存,这似乎有点粗鲁。虽然浏览器可以限制它(他们会这样做 - 稍后会详细介绍)但最好明确表示你想要的值。

顺便说一句,上述两个原因也是我不太喜欢预加载 HSTS 的原因。

还值得注意的是,浏览器通常会在 max-age 上设置一个上限(例如,通常是因为它存储为 32 位整数),因此在其中粘贴任意大的值是行不通的你认为它会怎样。事实上,我记得讨论过一个浏览器(Firefox?)没有进行边界检查,因此设置的值大于实际可能溢出的值,因此根本无法设置策略!正如我之前所说,预加载是使其永久化的方法。

六个月或一年的 max-age 是推荐的最佳做法,此后 returns 无论如何,更大的政策的安全性都会下降。如果访问者不是每 6-12 个月访问一次您的网站(此时他们将再刷新 HSTS 政策 max-age 秒),那么他们很可能正在使用新的浏览器或设备。