严格传输安全

HTTP 的 **Strict-Transport-Security** 响应头(通常缩写为 HSTS)通知浏览器网站只能通过 HTTPS 访问,并且任何将来尝试使用 HTTP 访问它的操作都应自动转换为 HTTPS。

注意:这比在服务器上简单地配置 HTTP 到 HTTPS(301)重定向更安全,因为在 HTTP 到 HTTPS 重定向中,初始的 HTTP 连接仍然容易受到中间人攻击。

头类型 响应头
禁止的头名称

语法

http
Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains; preload

指令

max-age=<过期时间>

浏览器应记住某个站点只能使用 HTTPS 访问的时间(以秒为单位)。

includeSubDomains 可选

如果指定了此可选参数,则此规则也适用于该站点的所有子域。

preload 可选 非标准

有关详细信息,请参阅 预加载严格传输安全。使用 preload 时,max-age 指令必须至少为 31536000(1 年),并且必须存在 includeSubDomains 指令。不是规范的一部分。

描述

如果网站通过 HTTP 接受连接并重定向到 HTTPS,则访问者可能最初会与网站的未加密版本通信,然后再被重定向,例如,如果访问者键入 http://www.foo.com/ 甚至只是 foo.com。这为中间人攻击创造了机会。可以利用重定向将访问者重定向到恶意网站,而不是原始网站的安全版本。

HTTP 严格传输安全标头通知浏览器永远不要使用 HTTP 加载站点,并且应自动将所有尝试使用 HTTP 访问站点的操作转换为 HTTPS 请求。

注意:当您的站点仅通过 HTTP 访问时,浏览器会忽略 Strict-Transport-Security 标头。一旦您的站点通过 HTTPS 访问且没有证书错误,浏览器就会知道您的站点支持 HTTPS,并将遵守 Strict-Transport-Security 标头。浏览器这样做是因为攻击者可能会拦截到站点的 HTTP 连接并注入或删除标头。

一个示例场景

您登录机场的免费 Wi-Fi 热点并开始上网,访问您的网上银行服务以检查余额并支付几张账单。不幸的是,您使用的接入点实际上是黑客的笔记本电脑,他们正在拦截您的原始 HTTP 请求并将您重定向到银行网站的克隆版本,而不是真正的网站。现在您的私人数据暴露给了黑客。

严格传输安全解决了此问题;只要您曾经使用 HTTPS 访问过银行的网站,并且银行的网站使用了严格传输安全,您的浏览器就会知道自动仅使用 HTTPS,从而防止黑客执行这种中间人攻击。

浏览器如何处理它

第一次使用 HTTPS 访问您的站点并且它返回 Strict-Transport-Security 标头时,浏览器会记录此信息,以便将来尝试使用 HTTP 加载该站点时将自动使用 HTTPS。

Strict-Transport-Security 标头指定的时间到期时,下次尝试通过 HTTP 加载该站点将照常进行,而不是自动使用 HTTPS。

每当将 Strict-Transport-Security 标头传递给浏览器时,它都会更新该站点的过期时间,因此站点可以刷新此信息并防止超时到期。如果需要禁用严格传输安全,则将 max-age 设置为 0(通过 https 连接)将立即使 Strict-Transport-Security 标头过期,从而允许通过 http 访问。

预加载严格传输安全

Google 维护着 一个 HSTS 预加载服务。通过遵循指南并成功提交您的域名,您可以确保浏览器仅通过安全连接连接到您的域名。虽然该服务由 Google 托管,但所有浏览器都使用此预加载列表。但是,它不是 HSTS 规范的一部分,不应视为官方的。

示例

所有当前和将来的子域名将在 1 年的 max-age 内使用 HTTPS。这阻止了访问只能通过 HTTP 提供的页面或子域名。

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

尽管对于域名来说,1 年的 max-age 是可以接受的,但建议的值是两年,如 https://hstspreload.org 中所述。

在以下示例中,max-age 设置为 2 年,并在后面添加了 preload,这对于包含在所有主要 Web 浏览器的 HSTS 预加载列表(如 Chromium、Edge 和 Firefox)中是必需的。

http
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

规范

规范
HTTP 严格传输安全 (HSTS)
# 第 6.1 节

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅