HSTS

这个 HTTP 头部用于强制浏览器只通过 HTTPS 连接,是具有里程碑意义的安全策略配置。以下是对各部分的详细拆解:


核心作用

HSTS(HTTP Strict Transport Security)
通过将网站标记为「仅限 HTTPS」来阻止浏览器使用 HTTP 协议连接,可防御以下攻击:

  • SSL Stripping(SSL剥离攻击)
  • Cookie 劫持
  • 中间人攻击(MITM)
  • 协议降级攻击

参数解析

1. max-age=31536000

  • 数值含义:有效期 31536000 秒 = 365天
  • 生效逻辑
    ① 浏览器首次访问时:
    ⠀└ 接收并记录该策略 → 开启 HSTS 保护
    ② 后续有效期内的访问:
    ⠀└ 无论用户输入 HTTP/HTTPS → 强制转为 HTTPS
    ③ 生效期间:
    ⠀└ 忽略证书错误警告(若配置不当可能导致无法访问)

2. includeSubDomains

  • 作用范围
    覆盖当前主域名及其所有子域名
    (例如 example.com 包含 api.example.com, cdn.example.com 等)
  • 安全要求
    必须确保所有子域都支持 HTTPS,否则会导致子域不可访问

核心实现原理

浏览器内部维护的 HSTS 列表工作机制:

sequenceDiagram participant User participant Browser participant Server User->>Browser: 输入 http://example.com Browser->>Server: 尝试通过 HTTP 访问 Server-->>Browser: 响应 307 跳转 + HSTS 头 Browser->>Browser: 记录 HSTS 规则到本地缓存 Browser->>Server: 自动转为 https://example.com loop 有效期内的请求 User->>Browser: 任何访问请求 Browser->>Server: 始终强制走 HTTPS end

配置建议

  1. 分阶段部署

    • 测试阶段 → max-age=300(5分钟)
    • 稳定后 → max-age=63072000(2年)
  2. 风险规避

    • 部署前确认所有子域 HTTPS 支持
    • 禁用 includeSubDomains 直到子域准备完成
    • 使用 HSTS 预加载必须满足全部严格标准
  3. 紧急救援(误配置时):

    # 快速撤销策略(将 max-age 设为0即刻失效)
    add_header Strict-Transport-Security "max-age=0; includeSubDomains";
    

安全增强技巧

  1. 预加载列表(Preload List)
    通过 hstspreload.org 提交申请,将域名硬编码到浏览器内核:

    Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
    
  2. Cookie 安全联动
    配合安全 Cookie 属性使用时防御级别更高:

    Set-Cookie: session=xxxx; Secure; HttpOnly; SameSite=Strict
    
  3. 结合 CSP
    与内容安全策略形成双层防护:

    Content-Security-Policy: upgrade-insecure-requests
    

特别注意:错误配置 HSTS 会导致业务陷入无法恢复的 HTTPS 强制依赖状态,部署前务必通过 curl -I 验证头部生效情况并保持完善的证书管理机制。

posted @ 2025-02-06 09:37  木燃不歇  阅读(81)  评论(0)    收藏  举报