跳到内容

HTTP 严格传输安全备忘单

简介

HTTP 严格传输安全(也称为 HSTS)是一种可选的安全增强功能,由 Web 应用程序通过使用特殊的响应头指定。一旦受支持的浏览器收到此头,该浏览器将阻止任何通过 HTTP 发送到指定域的通信,而是将所有通信通过 HTTPS 发送。它还阻止浏览器上的 HTTPS 点击提示。

该规范已于 2012 年底由 IETF 发布为 RFC 6797(HTTP 严格传输安全 (HSTS))。

威胁

HSTS 解决了以下威胁:

  • 用户书签或手动输入 http://example.com 并受到中间人攻击者的攻击
    • HSTS 自动将目标域的 HTTP 请求重定向到 HTTPS
  • 旨在纯粹使用 HTTPS 的 Web 应用程序无意中包含 HTTP 链接或通过 HTTP 提供内容
    • HSTS 自动将目标域的 HTTP 请求重定向到 HTTPS
  • 中间人攻击者试图使用无效证书拦截受害者用户的流量,并希望用户接受错误证书
    • HSTS 不允许用户覆盖无效证书消息

示例

简单示例,使用长(1 年 = 31536000 秒)max-age。此示例很危险,因为它缺少 includeSubDomains

Strict-Transport-Security: max-age=31536000

如果所有当前和未来的子域都将使用 HTTPS,此示例很有用。这是一个更安全的选项,但会阻止访问某些只能通过 HTTP 提供的页面

Strict-Transport-Security: max-age=31536000; includeSubDomains

如果所有当前和未来的子域都将使用 HTTPS,此示例很有用。在此示例中,我们设置了一个很短的 max-age,以防在初始推出期间出现错误

Strict-Transport-Security: max-age=86400; includeSubDomains

推荐

  • 如果网站所有者希望将其域包含在 Chrome 维护的(并被 Firefox 和 Safari 使用的)HSTS 预加载列表中,则使用以下标头。
  • 从您的网站发送 preload 指令可能会产生永久性后果,如果您发现需要切换回 HTTP,可能会阻止用户访问您的网站及其任何子域。请在发送带有 preload 的标头之前阅读 预加载移除处的详细信息。

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

preload 标志表示网站所有者同意其域被预加载。网站所有者仍需前往并提交该域到列表中。

问题

网站所有者可以使用 HSTS 在没有 Cookie 的情况下识别用户。这可能导致重大的隐私泄露。欲了解更多详情,请查看此处

Cookie 可以从子域操纵,因此省略 includeSubDomains 选项允许进行各种与 Cookie 相关的攻击,而 HSTS 本来可以通过要求子域的有效证书来阻止这些攻击。确保所有 Cookie 都设置了 secure 标志也将阻止部分(但不是全部)相同的攻击。

浏览器支持

截至 2019 年 9 月,HSTS 得到所有现代浏览器的支持,唯一值得注意的例外是 Opera Mini。

参考资料