详解 HTTP 严格传输安全(HSTS)
HTTP 严格传输安全(HSTS)是一个响应头,它告诉浏览器只通过 HTTPS 连接你的网站。一旦浏览器见过它,在策略有效期内就会拒绝对你域名的明文 HTTP 连接。
这是什么
HSTS 通过 Strict-Transport-Security 响应头传递,例如 max-age=31536000; includeSubDomains; preload。max-age 表示浏览器记住该规则的时长(以秒为单位)。
在首次 HTTPS 访问之后,浏览器会自动把之后的每个请求升级为 HTTPS——用户不会意外访问到不安全的版本,攻击者也无法把连接降级回 HTTP。
为什么重要
没有 HSTS,用户发出的第一个请求(输入 yourdomain.com)会走明文 HTTP,可能在你重定向到 HTTPS 之前就被拦截——这是经典的 SSL stripping 攻击。
过弱的 HSTS 策略会削弱防护:较短的 max-age 会缩短强制执行的时间窗口,而省略 includeSubDomains 会让每个子域名都暴露于降级风险。
如何修复
使用较长的 max-age(一年),覆盖子域名,并加入 preload。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload只有在每个子域名都提供有效 HTTPS 之后,再添加 includeSubDomains 和 preload——否则你可能会把用户挡在尚未就绪的子域名之外。
当你的响应头包含 'preload' 后,在 hstspreload.org 提交你的域名,这样浏览器即使在第一次访问时也会强制 HTTPS。
常见问题
我该用多大的 max-age?
至少 15552000(6 个月);31536000(1 年)是常见推荐值,也是 preload 列表所要求的。
HSTS 会把我挡在自己的网站之外吗?
只有当你之后需要通过 HTTP 提供服务,或某个子域名没有 HTTPS 时才会。在启用 includeSubDomains 或 preload 之前,请充分测试。