HSTS

Author Avatar
Klein 3月 18, 2024

HSTS 是一种网络安全策略,它强制浏览器在与特定网站通信时仅使用 HTTPS(加密的 HTTP)。它通过在 HTTP 响应标头中设置 Strict-Transport-Security 头字段来实现。

工作原理

当浏览器收到包含 Strict-Transport-Security 头字段的 HTTP 响应时,它会将该网站添加到其 HSTS 预加载列表中。此列表由浏览器维护,其中包含已知强制使用 HTTPS 的网站。

当浏览器随后尝试与该网站通信时,它将自动将连接升级到 HTTPS,即使用户输入了 HTTP。这消除了用户在无意中连接到网站的非加密版本时被中间人攻击的风险。

好处

  • 防止中间人攻击:HSTS 可防止攻击者通过劫持 HTTP 连接来窃取敏感数据或重定向用户。
  • 提高用户隐私:HTTPS 加密所有数据,保护用户免受窥探和数据窃取。
  • 增强网站安全性:HSTS 有助于保护网站免受其他基于 HTTP 的攻击,例如会话劫持和跨站点脚本 (XSS)。
  • 提高用户体验:HSTS 消除了浏览器安全警告,为用户提供无缝且安全的浏览体验。

HSTS 头字段

Strict-Transport-Security 头字段具有以下语法:

1
2
Strict-Transport-Security: max-age=seconds;
includeSubDomains; preload
  • max-age:指定浏览器在将网站添加到 HSTS 列表中之前应等待多长时间(以秒为单位)。
  • includeSubDomains:指示浏览器将 HSTS 策略应用于网站的所有子域。
  • preload:指示浏览器将网站添加到其预加载 HSTS 列表中。这会立即触发 HSTS 策略,而无需等待 max-age

部署 HSTS

要部署 HSTS,网站所有者需要在所有 HTTP 响应中设置 Strict-Transport-Security 头字段。建议使用以下值:

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

此设置将网站添加到 HSTS 预加载列表中,并在浏览器中强制使用 HTTPS 长达一年。

注意事项

  • 浏览器支持:大多数现代浏览器都支持 HSTS。
  • 混合内容:如果网站包含未通过 HTTPS 提供的资源(例如图像或脚本),则 HSTS 可能会导致浏览器显示混合内容警告。
  • HSTS 预加载列表:网站所有者无法直接将他们的网站添加到 HSTS 预加载列表中。该列表由浏览器维护,网站所有者必须遵守 HSTS 要求才能被添加到该列表中。
  • HSTS 绕过:攻击者可能会使用某些技术来绕过 HSTS,例如 DNS 欺骗或使用非标准端口。

HSTS 列表

  • 由浏览器维护。
  • 当浏览器收到包含 Strict-Transport-Security 头字段的 HTTP 响应时,它会将网站添加到其 HSTS 列表中。
  • max-age 值指定的持续时间内,浏览器会自动将与该网站的所有连接升级到 HTTPS。
  • max-age 值过后,网站将从 HSTS 列表中删除,并且浏览器将不再自动强制使用 HTTPS。

    HSTS 预加载列表

  • 也是由浏览器维护的,但它是预先填充的列表,其中包含已知强制使用 HTTPS 的网站。

  • 当浏览器收到包含 preload 指令的 Strict-Transport-Security 头字段时,它会将网站添加到其 HSTS 预加载列表中。
  • 网站一旦被添加到 HSTS 预加载列表中,浏览器就会立即强制使用 HTTPS,而无需等待 max-age
  • 即使用户清除浏览器缓存或 cookie,HSTS 策略仍会继续生效。

为什么 HSTS 预加载列表的网站即时用户清除浏览器缓存或 cookie,HSTS 策略仍会继续生效呢?

HSTS 预加载列表的网站即使用户清除浏览器缓存或 cookie,HSTS 策略仍会继续生效,这是因为:

  • HSTS 预加载列表存储在浏览器中:HSTS 预加载列表存储在浏览器的内部数据库中,与浏览器缓存和 cookie 分开。清除浏览器缓存或 cookie 不会影响 HSTS 预加载列表。
  • HSTS 策略与浏览器绑定:HSTS 策略与特定浏览器绑定。这意味着 HSTS 策略存储在浏览器的配置文件中,而不是在网站的缓存或 cookie 中。因此,清除浏览器缓存或 cookie 不会影响 HSTS 策略。

当浏览器收到包含 preload 指令的 Strict-Transport-Security 头字段时,它会将网站添加到其 HSTS 预加载列表中。然后,浏览器会立即强制使用 HTTPS,并且该策略会一直持续下去,直到浏览器将其删除。

清除浏览器缓存或 cookie 只能删除存储在浏览器缓存或 cookie 中的数据。它不会影响存储在浏览器内部数据库或配置文件中的数据,例如 HSTS 预加载列表和 HSTS 策略。

因此,HSTS 预加载列表的网站即使用户清除浏览器缓存或 cookie,HSTS 策略仍会继续生效,因为该策略存储在浏览器中,并且与浏览器缓存和 cookie 分开。

安全性

为什么说使用 HSTS 能防止中间人攻击?

HSTS 能防止中间人攻击,因为它是强制浏览器仅通过 HTTPS 与网站通信。中间人攻击是一种攻击,其中攻击者拦截通信并冒充其中一方。如果网站使用 HTTP,攻击者可以拦截 HTTP 请求并重定向用户到虚假网站,窃取他们的凭据或其他敏感信息。

HSTS 通过以下方式防止这种攻击:

  • **强制 HTTPS:HSTS 强制浏览器仅通过 HTTPS 与网站通信,即使用户输入了 HTTP。这消除了攻击者拦截 HTTP 请求并重定向用户的机会。
  • **预加载列表:HSTS 预加载列表包含已知强制使用 HTTPS 的网站。当浏览器访问 HSTS 预加载列表中的网站时,它会自动使用 HTTPS,而无需等待 max-age。这进一步减少了中间人攻击的风险。

场景举例:

你登录到一个免费 Wi-Fi 热点,然后开始浏览网站,访问你的网上银行,查看你的支出,并且支付一些订单。很不幸,你接入的 Wi-Fi 实际上是黑客的笔记本热点,他们拦截了你原始的 HTTP 请求,然后重定向到一个与你银行网站一模一样的钓鱼网站。现在,你的隐私数据暴露给黑客了。

Strict Transport Security 解决了这个问题;只要你通过 HTTPS 请求访问银行网站,并且银行网站配置好 Strict Transport Security,你的浏览器知道自动使用 HTTPS 请求,这可以阻止黑客的中间人攻击的把戏。

HSTS 方案和配置 HTTP 到 HTTPS(301)重定向方案比较

HSTS 比起 301 重定向的好处:

  • 更难绕过:攻击者可以绕过 301 重定向,例如使用 DNS 欺骗或使用非标准端口。HSTS 更难绕过,因为它是由浏览器强制执行的。
  • 更全面:HSTS 适用于所有类型的请求,包括 POST 请求和 AJAX 请求。301 重定向仅适用于 GET 请求。
  • 更用户友好:HSTS 消除了浏览器安全警告,为用户提供无缝且安全的浏览体验。

在可能的情况下,使用 HSTS 方案比配置 HTTP 到 HTTPS(301)重定向方案更好,因为 HSTS 提供了更高级别的安全性。然而,在某些情况下,使用 301 重定向可能是必要的,例如:

  • 网站无法获得 SSL 证书。
  • 网站需要支持旧浏览器,这些浏览器不支持 HSTS。
  • 网站需要灵活地从 HTTP 迁移到 HTTPS。