严格传输安全
HTTP 的 **Strict-Transport-Security
** 响应头(通常缩写为 HSTS)通知浏览器网站只能通过 HTTPS 访问,并且任何将来尝试使用 HTTP 访问它的操作都应自动转换为 HTTPS。
注意:这比在服务器上简单地配置 HTTP 到 HTTPS(301)重定向更安全,因为在 HTTP 到 HTTPS 重定向中,初始的 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 规范的一部分,不应视为官方的。
- 有关 Chrome 中 HSTS 预加载列表的信息: https://www.chromium.org/hsts/
- 查询 Firefox HSTS 预加载列表: nsSTSPreloadList.inc
示例
所有当前和将来的子域名将在 1 年的 max-age
内使用 HTTPS。这阻止了访问只能通过 HTTP 提供的页面或子域名。
Strict-Transport-Security: max-age=31536000; includeSubDomains
尽管对于域名来说,1 年的 max-age
是可以接受的,但建议的值是两年,如 https://hstspreload.org 中所述。
在以下示例中,max-age
设置为 2 年,并在后面添加了 preload
,这对于包含在所有主要 Web 浏览器的 HSTS 预加载列表(如 Chromium、Edge 和 Firefox)中是必需的。
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
规范
规范 |
---|
HTTP 严格传输安全 (HSTS) # 第 6.1 节 |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。
另请参阅
- 博文: HTTP 严格传输安全已上线!
- 博文: HTTP 严格传输安全(强制 HTTPS)
- OWASP 文章: HTTP 严格传输安全
- 维基百科: HTTP 严格传输安全
- HSTS 预加载服务
- 限制在安全上下文中使用的功能