4. HTTP安全响应头缺失与配置错误检测

HTTP安全响应头缺失与配置错误检测 学习卡片

为什么安全响应头是“零成本防线”

HTTP 安全响应头由服务端在响应中下发,浏览器据此限制脚本来源、强制 HTTPS、禁止被 iframe 嵌套。它们不改变业务逻辑,却能直接阻断一整类攻击链。检测的核心不是“有没有”,而是“值是否正确、是否覆盖关键路径”。

安全响应头检测:从响应到风险判定 同一响应中三类头分别对应脚本注入、降级、点击劫持三条风险链 目标响应 GET /account 200 OK text/html 代理工具截获 响应头逐项判定 Content-Security-Policy 缺失 → XSS 无脚本来源约束 含 unsafe-inline → 内联脚本可执行 default-src 过宽 → 外域脚本可加载 Strict-Transport-Security 缺失 → 首次 HTTP 可被降级劫持 max-age 过短 → 保护窗口不足 无 includeSubDomains → 子域暴露 X-Frame-Options 缺失 → 页面可被任意站点 iframe ALLOW-FROM → 兼容性差且易失效 应使用 DENY 或 SAMEORIGIN 脚本注入风险 存储型 XSS 可执行 恶意外域脚本加载 数据外带通道打开 降级劫持风险 HTTP 明文请求被截 302 跳转至攻击者站点 Cookie 随明文泄露 点击劫持风险 透明 iframe 覆盖 诱导点击转账/授权 用户无感知操作 判定原则: 缺失 = 高危;存在但值过宽/过短 = 中危;DENY + 长 max-age + 严格 CSP = 通过

检测命令与判读

用 curl 只取响应头,避免下载正文干扰判断。重点看三类头是否存在、值是否合理:

curl -sI https://target.example.com/account | grep -iE \
  'content-security-policy|strict-transport-security|x-frame-options'

若输出为空,说明三类头全部缺失,属于高危配置。若只返回部分,逐项对照下表判定。

响应头安全值示例危险配置对应风险
Content-Security-Policydefault-src 'self'; script-src 'self'缺失 / unsafe-inline / *XSS 脚本注入
Strict-Transport-Securitymax-age=31536000; includeSubDomains缺失 / max-age=0 / 过短HTTPS 降级劫持
X-Frame-OptionsDENY 或 SAMEORIGIN缺失 / ALLOW-FROM点击劫持
HSTS 只在 HTTPS 响应中生效。若站点仍可通过 HTTP 访问且未跳转,即使设置了 HSTS,首次请求仍可能被中间人劫持。

验证闭环

  1. 对首页、登录页、账户页分别执行上述 curl,确认安全头是否全站覆盖,而非仅首页设置。
  2. 对返回 X-Frame-Options: SAMEORIGIN 的页面,构造同源 iframe 测试是否可嵌入;若可嵌入,说明该头未真正生效或被覆盖。
  3. 检查 CSP 是否包含 unsafe-inline 或 unsafe-eval,若有则记录为配置错误而非缺失。
  4. 确认 HSTS 的 max-age 是否 ≥ 15552000(180 天),低于此值标记为保护窗口不足。
修复优先级:先补 X-Frame-Options(阻断点击劫持),再补 HSTS(阻断降级),最后收紧 CSP(阻断 XSS)。CSP 上线前先用 Report-Only 模式观察误报。