4. HTTP安全响应头缺失与配置错误检测
为什么安全响应头是“零成本防线”
HTTP 安全响应头由服务端在响应中下发,浏览器据此限制脚本来源、强制 HTTPS、禁止被 iframe 嵌套。它们不改变业务逻辑,却能直接阻断一整类攻击链。检测的核心不是“有没有”,而是“值是否正确、是否覆盖关键路径”。
检测命令与判读
用 curl 只取响应头,避免下载正文干扰判断。重点看三类头是否存在、值是否合理:
curl -sI https://target.example.com/account | grep -iE \
'content-security-policy|strict-transport-security|x-frame-options'
若输出为空,说明三类头全部缺失,属于高危配置。若只返回部分,逐项对照下表判定。
| 响应头 | 安全值示例 | 危险配置 | 对应风险 |
|---|---|---|---|
| Content-Security-Policy | default-src 'self'; script-src 'self' | 缺失 / unsafe-inline / * | XSS 脚本注入 |
| Strict-Transport-Security | max-age=31536000; includeSubDomains | 缺失 / max-age=0 / 过短 | HTTPS 降级劫持 |
| X-Frame-Options | DENY 或 SAMEORIGIN | 缺失 / ALLOW-FROM | 点击劫持 |
HSTS 只在 HTTPS 响应中生效。若站点仍可通过 HTTP 访问且未跳转,即使设置了 HSTS,首次请求仍可能被中间人劫持。
验证闭环
- 对首页、登录页、账户页分别执行上述 curl,确认安全头是否全站覆盖,而非仅首页设置。
- 对返回
X-Frame-Options: SAMEORIGIN的页面,构造同源 iframe 测试是否可嵌入;若可嵌入,说明该头未真正生效或被覆盖。 - 检查 CSP 是否包含
unsafe-inline或unsafe-eval,若有则记录为配置错误而非缺失。 - 确认 HSTS 的
max-age是否 ≥ 15552000(180 天),低于此值标记为保护窗口不足。
修复优先级:先补 X-Frame-Options(阻断点击劫持),再补 HSTS(阻断降级),最后收紧 CSP(阻断 XSS)。CSP 上线前先用 Report-Only 模式观察误报。