这几行响应头是成本最低、收益最高的安全加固手段——配置一次,浏览器就会主动替你抵御点击劫持、MIME 嗅探、降级攻击等问题。
-
启用头数
-
安全评分
-
HSTS 秒数
-
评分构成:HSTS 基础 30 分(includeSubDomains +10、preload +10)、X-Frame-Options 12 分、X-Content-Type-Options 12 分、Referrer-Policy 12 分、Permissions-Policy 8 分、COOP 6 分,满分 100。
六个安全响应头各管什么
| 响应头 | 防御的问题 | 推荐值 |
|---|---|---|
| Strict-Transport-Security | SSL 剥离、中间人降级到 HTTP | max-age=31536000; includeSubDomains |
| X-Frame-Options | 点击劫持(把站点嵌进 iframe 诱导点击) | SAMEORIGIN |
| X-Content-Type-Options | MIME 类型嗅探导致的脚本注入 | nosniff |
| Referrer-Policy | 跨站请求时泄露完整 URL(可能含敏感参数) | strict-origin-when-cross-origin |
| Permissions-Policy | 第三方脚本擅自调用摄像头、麦克风、定位 | geolocation=(), microphone=(), camera=() |
| Cross-Origin-Opener-Policy | 跨窗口引用与 Spectre 类侧信道攻击 | same-origin |
HSTS 要小心使用
HSTS 是这六个里唯一"不可逆"的——一旦浏览器收到 max-age,在有效期内会强制把这个域名及其子域名的 http 请求升级为 https,即使用户手动输入 http:// 也一样。如果此时你的 HTTPS 证书出问题,网站会直接打不开,且无法通过回退 HTTP 挽救。
所以正确的上线节奏是:
- 先设较小的值(如 max-age=300),确认 HTTPS 全站可用、无混合内容告警。
- 逐步提高到 86400(1 天)、604800(1 周)。
- 确认子域名也全部支持 HTTPS 后,再加 includeSubDomains。
- 长期稳定(通常数月后)再考虑 preload,因为提交到浏览器预加载列表后,移除需要等数月。
Permissions-Policy 的语法陷阱
这个头的语法和其他头不太一样,容易写错。geolocation=() 表示禁止所有来源;geolocation=(self) 表示只允许本站;geolocation=* 表示允许所有来源。写成了分号分隔或漏掉括号都是无效的。
Permissions-Policy: geolocation=(), microphone=(), camera=()
验证方法
配置后在浏览器开发者工具的 Network 面板查看文档请求的 Response Headers;或使用线上安全头检测服务(如 securityheaders.com)打分。注意有些头(特别是 HSTS 和 COOP)对子资源请求无效,只作用于文档请求。
另外别忘了:这些头写在服务器配置里只对当前站点生效。如果用了 CDN,需要在 CDN 侧配置或确保源站头被透传,否则可能出现"源站配了但用户收到的响应里没有"的情况。
你可能还想问
常见的安全头有哪些?
内容安全策略、点击劫持防护、内容类型嗅探限制、引用来源策略等;它们从不同维度降低常见前端攻击风险。
内容安全策略会不会误伤?
会。策略过严会拦住正常的内联脚本或外部资源;建议先用报告模式观察,收集完整后再逐步收紧。
加多少合适?
先从低风险、易落地的头开始,再逐步加严;上线后持续看报告与报错,避免一次性收紧导致页面异常。
速查在线工具箱