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。