安全响应头深度检查

安全响应头是服务器在每个 HTTP 响应中附带的指令,用来让浏览器开启默认不启用的保护:拦截注入脚本、强制 HTTPS、拒绝被嵌入框架、停止 MIME 嗅探。输入一个 URL,本检查器会抓取最终响应,按 100 分制为六个响应头评分,逐项显示它实际找到的值、用一句话说明风险,并为缺失或偏弱的响应头给出可粘贴的 Nginx 或 Apache 配置。如果你只想要快速版,网站健康检查的整体报告里已经包含一个安全响应头子分数——本页是深度版:只有逐项等级和修复,别无其他。

最后更新:

想持续监控这个网站?用 myeventwatch 免费监控——到期和宕机提醒,无需绑卡。

深度版,与健康检查的快速分数并存

网站健康检查回答的是一个宽泛的问题——这个网站整体健康吗?——并把安全响应头折算成众多子分数之一。那是例行体检的正确形状,但它无法告诉你哪一个响应头丢了分、你的服务器实际发送了什么值、或者该往配置里粘贴什么来修复它。本页就是为后续修复工作而存在的:一次抓取、六个被评分的响应头、一个字母等级,并且为每个缺失或偏弱的响应头给出精确的 Nginx 与 Apache 配置行。这里没有任何黑箱——完整的评分表就公布在下方的事实部分,而且它正是检查器评分所依据的那张表。

检查的运行方式:检查器请求你输入的 URL、跟随重定向,并为最终响应的响应头评分——也就是浏览器真正用来构建页面的那个响应。这是一次普通 HTTP 抓取,不是浏览器:不执行 JavaScript、不加载子资源,登录后或只在其他路径上出现的响应头不会被看到。分数只衡量一个具体的层面——这六项面向浏览器的保护是否存在且足够强——仅此而已。一个网站可以得 100 分却仍然带有应用层漏洞;也可以得 F 却从未被入侵。把等级当作一份带权重的加固清单,而不是对整个网站安全性的判决。

按影响顺序修复

大部分分数赢回来都很便宜。X-Content-Type-Options、框架防护和 Referrer-Policy 各是一行配置,在普通网站上不会破坏任何东西。Strict-Transport-Security 也是一行,但只有当每个页面和子域名都真的能通过 HTTPS 正常工作时再发送它——一年的 max-age 是浏览器会要求你兑现的承诺。Permissions-Policy 需要花十分钟想清楚你的页面真正使用哪些浏览器功能。Content-Security-Policy 分数最高、风险也最大:先以 Content-Security-Policy-Report-Only 的形式部署,观察违规报告,修好被破坏的东西,然后再强制启用。配套指南安全响应头详解逐项说明每个响应头到底拦截什么,以及为什么修复顺序是上面这个顺序。

相邻的检查:传输安全是这个故事的另一半——SSL 评分器为 TLS 配置本身打分,而本页为服务器在那条连接上所说的话打分。想要包含响应头、可用性、DNS 和证书到期在内的宽泛例行体检,请回到网站健康检查。

关于方法的一点说明:结果是某一时刻一次抓取的快照。CDN 和多服务器部署可能对不同请求返回不同的响应头集合,因此遇到意外的结果时,值得先重新检查一次再改配置——改完之后也值得再查一次,因为在源站加上的响应头并不总能穿过它前面的代理。

公布的评分表

Content-Security-Policy — 35 分“好”意味着一个被强制执行的策略(Report-Only 不算),它让脚本远离 'unsafe-inline' 和 'unsafe-eval',并限制资源可以从哪里加载。权重最高,因为 CSP 是抵御注入脚本的主要防线。
Strict-Transport-Security — 20 分“好”意味着通过 HTTPS 发送、max-age 至少一年(31536000 秒);includeSubDomains 会让它更强。max-age 较短只能拿到部分分数。
框架防护 — 15 分“好”意味着 CSP 的 frame-ancestors 指令,或设置为 DENY / SAMEORIGIN 的 X-Frame-Options 响应头,使其他网站无法把你的页面嵌入框架进行点击劫持。
X-Content-Type-Options — 10 分“好”意味着唯一的值 nosniff,使浏览器无法把响应 MIME 嗅探成另一种可执行类型。
Referrer-Policy — 10 分“好”意味着一个从不向其他源发送完整 URL 的策略——strict-origin-when-cross-origin 或更严格的(same-origin、no-referrer)。
Permissions-Policy — 10 分“好”意味着该响应头存在,并关闭了网站不使用的强大浏览器功能,如摄像头、麦克风和地理位置。
Cross-Origin-Opener-Policy — 奖励项与被评分的响应头一同报告,但不计分:它把你的页面与跨源窗口隔离,并刻意置于 100 分之外,这样公布的权重就恰好只有上面六个响应头。
等级95 分及以上为 A+,90+ 为 A,80+ 为 B,65+ 为 C,50+ 为 D,35+ 为 E,低于 35 为 F。每个响应头按所找到值的强度计分;缺失的响应头该项得零分。

常见问题

分数是怎么算的——是黑箱吗?

不是。六个响应头带有固定的公布权重——CSP 35、HSTS 20、框架防护 15、X-Content-Type-Options 10、Referrer-Policy 10、Permissions-Policy 10——总计 100。每个响应头根据检查器找到的值的强度获得满分、部分分数或零分,字母等级按上方事实表中的区间划分。Cross-Origin-Opener-Policy 作为奖励项报告,从不影响分数。

这与网站健康检查有什么不同?

网站健康检查是一次宽泛的体检——可用性、DNS、TLS、到期时间等等——其中安全响应头只是一个快速子分数。本页只评响应头,但评得很深:逐项找到的确切值、逐项判定与分数、用通俗语言说明的风险,以及可粘贴的 Nginx 和 Apache 修复。用健康检查发现问题,用本页修复它。

到底评的是哪个响应——我的网站有重定向?

被评分的是所有重定向之后最终响应的响应头,因为那才是浏览器用来构建页面的响应。结果会显示最终 URL 和状态码,让你看清链条落在了哪里。一个注意事项:这是静态抓取,不是浏览器——不运行 JavaScript,因此框架只在客户端添加的响应头、或只在登录后或只在其他路径上出现的响应头,都不计入等级。

我的网站得了 F,是不是说明它被黑了?

不是。F 意味着最终响应几乎没有携带六个被评分响应头中的任何一个——这是默认服务器或框架安装的常见状态。它说明你访客的浏览器没有得到本可以得到的保护;它并不说明网站本身已被入侵。按影响顺序逐项修复并重新检查:大多数网站一个下午就能爬升好几个等级。

100 分是否意味着我的网站是安全的?

不是——它只意味着在被检查的 URL 上,这六个响应头存在且足够强。响应头只是一个加固层:它修不了应用漏洞、弱密码、过期软件或损坏的 TLS 配置。把本检查与为传输层打分的 SSL 评分器和更全面的 网站健康检查搭配使用。