HTTP 安全响应头审计:网站缺了哪些安全头,怎么补齐
讲清楚 HSTS、CSP、X-Frame-Options、X-Content-Type-Options、Referrer-Policy 这几个 HTTP 安全响应头各自挡什么攻击,如何检查站点缺口,并给出一份可直接照抄的加固清单。
HTTP 安全响应头审计:网站缺了哪些安全头,怎么补齐
一个站点能正常打开,不代表它在浏览器层面是安全的。很多攻击,点击劫持、MIME 嗅探、协议降级、Cookie 劫持,根源都不是后端逻辑有漏洞,而是几个 HTTP 安全响应头没设或者设错了。这篇文章把最该关注的几个头逐个讲清楚:它各自挡的是什么攻击,缺了会怎样,以及怎么补。
为什么安全头比你想的重要
响应头是服务器对浏览器下的指令。浏览器内置了一整套防御机制,但默认大多是关闭的,你不发指令,它就不开。比如不发 Strict-Transport-Security,浏览器就允许用户被中间人从 HTTPS 降级回 HTTP;不发 X-Frame-Options,你的页面就能被任意网站套进 iframe 做点击劫持。这些防御不需要改一行业务代码,只要在反向代理或 CDN 上加几行配置。投入很小,挡住的却是一整类攻击。
五个必须有的安全头
Strict-Transport-Security(HSTS) 强制浏览器只用 HTTPS 访问你的域名。设了它,即使用户手输 http:// 或点了 HTTP 链接,浏览器也会在本地直接改写成 HTTPS,完全不发明文请求,从而堵死 SSL Strip 这类降级攻击。建议 max-age 至少一年。
Content-Security-Policy(CSP) 是对抗 XSS 最有力的一道防线,它白名单化了页面能加载脚本、样式、图片的来源。配置时最容易踩的坑是图省事写了 unsafe-inline 或 unsafe-eval,等于把这道防线拆了一半。
X-Frame-Options 控制你的页面能不能被别人 iframe 进去。设成 DENY 就是任何站点都不许嵌套,直接防住点击劫持,也就是攻击者把你的真实页面盖在一个透明诱导层下,骗用户点击。现代写法是用 CSP 的 frame-ancestors,但 X-Frame-Options 兼容性更好,两个一起发最稳。
X-Content-Type-Options: nosniff 关闭浏览器的 MIME 类型嗅探。没有它,浏览器可能把一个声明为图片的响应当脚本执行,这正是 MIME 嗅探攻击的入口。它只有一个固定值 nosniff,加上没有任何副作用。
Referrer-Policy 控制跳转时带出多少来源信息。默认行为常常把完整 URL(包含路径甚至查询参数里的 token)泄露给第三方站点,设成 strict-origin-when-cross-origin 能在跨站时只暴露域名。
一组可以直接抄的安全头配置
下面这组配置适合大多数普通网站,放进 Nginx 或 CDN 边缘规则即可:
Strict-Transport-Security: max-age=31536000; includeSubDomains
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'none'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), camera=(), microphone=()
别忘了 Cookie。如果站点已经全站 HTTPS,每个 Set-Cookie 都该带上 Secure、HttpOnly、SameSite。漏掉 Secure 会让 Cookie 在偶发的 HTTP 请求里明文外泄,漏掉 SameSite 则给 CSRF 留了口子。
我自己审计时的顺序
我维护一个站点时,养成了上线前必跑一遍头审计的习惯。做法很简单:先 curl -I https://你的域名 把响应头抓下来,然后逐项对照上面那张清单看缺什么。我把这一步交给 HTTP 安全响应头审计器 来做,粘贴 curl 输出,它会把 HSTS、CSP、X-Frame-Options、Cookie 标记这些逐条标出缺口,直接生成一份 Markdown 清单。最让我意外的一次,是发现某次 CDN 迁移后 CSP 里悄悄混回了 unsafe-inline,自己肉眼扫根本没注意到。整个工具纯本地解析,不会真的去请求站点,所以贴生产响应头也不担心外泄。
一份落地加固清单
照这个顺序补,基本能覆盖大多数风险:
- 全站启用 HSTS,
max-age至少一年,确认所有子域都能走 HTTPS 再加includeSubDomains。 - 配一条最小化的 CSP,先用
default-src 'self',逐步放开必要来源,坚决不写unsafe-eval。 - 同时发
X-Frame-Options: DENY和 CSP 的frame-ancestors 'none'。 - 加
X-Content-Type-Options: nosniff,无脑加,没有副作用。 - 设
Referrer-Policy: strict-origin-when-cross-origin。 - 逐个检查
Set-Cookie,补齐 Secure、HttpOnly、SameSite。 - 删掉
Server、X-Powered-By这类暴露技术栈的头,减少攻击者的信息面。
响应头只是网站安全的一层。如果你还想顺手排查代码或配置里有没有泄露密钥,可以再过一遍 环境变量密钥扫描器。安全是叠起来的,每补一层,攻击者要付出的成本就多一分。
Made by Toolora · Updated 2026-06-13