⌘K 切换工具
SECURITY

HTTP 安全响应头检查工具

为站点的 HTTP 安全响应头评分,并说明每个缺失项会暴露什么。

server
security-headers

🌐 sitekits fetches the URL server-side (private/internal addresses are blocked). Only response headers are read — the body is never retrieved.

§01 关于此工具

概述

安全响应头是站点防御中完全存在于响应里的部分,因此易于检查,也易于在细节上出错。 响应头可以存在却毫无作用:max-age=0 会关闭 HSTS,含 'unsafe-inline' 的 CSP 照样执行被注入的 <script>,而 X-Frame-Options: ALLOW-FROM 会被今天所有在售 浏览器忽略。

本工具在服务器端获取该 URL,只读取响应头,并按加权百分制为七个项目评分。权重反映 每一项实际防住了什么,每个分数都附有指出具体暴露面的备注,而不是笼统的「缺少响应头」。

使用方法

  1. 粘贴 URL。可省略协议,默认按 https 处理。
  2. 阅读等级与各项分数。
  3. 依次处理备注。每条描述的是被暴露的内容,而不只是缺了什么。

权重的含义

只数响应头会把所有缺失一视同仁,而实际并非如此:缺少 X-Frame-Options 可以由 CSP 的 frame-ancestors 覆盖,而缺少 CSP 则没有任何替代。

项目权重理由
Content-Security-Policy25唯一能阻止被注入脚本执行并外传数据的响应头
Strict-Transport-Security20阻止首次请求被降级为 HTTP
嵌入保护15点击劫持;由 CSP frame-ancestors X-Frame-Options 满足
X-Content-Type-Options10错误的 content-type 被重新解释为脚本
Referrer-Policy10您的 URL 有多少会泄漏到其他来源
Permissions-Policy10摄像头、麦克风与地理位置被隐式放开
版本信息披露10这是扣分项,不是保护项——见下文

取值的读法

CSP 从 100 分起算,按实际削弱它的因素扣分。有效 script-src 中的 'unsafe-inline' 扣 45 分——但仅当既无 nonce 也无 hash 时,因为理解它们的浏览器 会完全忽略 'unsafe-inline''unsafe-eval' 扣 20 分。缺少 base-uri 扣 15 分: 没有它,被注入的 <base> 元素会改写页面上所有相对 URL,脚本地址也包括在内。 缺少 object-src 'none' 扣 10 分。只设置 Content-Security-Policy-Report-Only 得 0 分,因为它什么都不拦——那是测量手段, 不是防御。

HSTSmax-age 评分:一年及以上得 80 分,六个月得 60 分,更短得 35 分, max-age=0 得 0 分,因为它关闭了 HSTS。includeSubDomains 加 20 分,正确配置的 响应头正是靠这一项达到 100 分。六个月同时是浏览器预加载列表的下限,因此更短的取值 无论意图如何都无法预加载。

嵌入保护由 CSP frame-ancestors 满足可得满分,X-Frame-Options: DENY / SAMEORIGIN 得 60 分——它仍然有效,但规范已经向前走了。ALLOW-FROM 得 0 分: Chrome 从未实现,Firefox 在 70 版移除,因此依赖它的页面可被嵌入。

版本信息披露是唯一的扣分项。Server: Apache/2.4.41X-Powered-By: PHP/7.4.3 会准确告知攻击者该试哪些已公开的 CVE,而两者都不保护 任何东西。不含版本号的取值(例如 Server: cloudflare)不扣分:多数 CDN 总是发送 它且无法移除,扣分就成了谁也无法修正的项目。

本工具看不到的内容

响应头只是其中一层。满分并未说明您的 TLS 配置、Cookie 的属性、认证是否真正强制, 或者您的 CSP 允许的某个来源本身是否托管着受攻击者控制的内容。

Set-Cookie 的属性尤其不在评分范围内,因为它们以单个 Cookie 为单位而非以响应为 单位:缺少 HttpOnlySecure 的会话 Cookie 是严重问题,而任何响应头评分都 不会显示出来。

CSP 也是按语法与关键字评分,而不是按您的允许列表评分。策略 script-src 'self' https://cdn.example.com 可得满分,而若该 CDN 提供用户上传的 JavaScript,这条策略毫无保护作用。评分衡量策略的形态,来源是否妥当需要由人判断。

示例

  • 确认改动是否已到生产环境 — 在修改 CDN 配置前后各评一次分。源站设置的响应头 被代理删除或覆盖是常见情况,而这是查看浏览器实际收到的响应的最快方式。
  • 向团队说明发现 — 备注陈述的是机制,比审计表格里的一个响应头名称更有说服力。
  • 检查重定向的目标 — 评分对象是最终响应的响应头。跳转到另一主机的落地页, 常常落在一个不具备入口页任何响应头的地方。
  • 申请 HSTS 预加载之前 — 提交要求 max-age 至少一年,并带 includeSubDomainspreload。预加载难以撤销,因此请先在每个子域上确认响应头。
  • 构建策略本身CSP 生成器按指令逐条组装响应头, 当您需要原样取值时,HTTP 响应头查看会显示完整的原始响应。

说明

评分对象是最终响应的响应头。若 URL 发生重定向,等级描述的是落点,同时显示跳转链, 以便发现入口与目的地响应头不一致的情况。

同一项目也接受 Feature-Policy 代替 Permissions-Policy,因为仍有服务器发送旧名 称。Referrer-Policy 在取值为 no-referrersame-originstrict-originstrict-origin-when-cross-origin 时得满分;其他取值得一半,因为它们向其他来源 泄漏了超出必要范围的 URL 内容。

只处理响应头。本工具绝不获取、保存或转发响应正文,对私有地址、回环地址、链路本地 地址与保留地址的请求在建立任何连接之前即被拒绝——重定向之后也同样处理。详情见 隐私政策

FAQ
为什么这里的分数比其他检测站点低?
多数检测只统计响应头的数量,本工具读取它们的取值。既无 nonce 也无 hash 的 'unsafe-inline' CSP 拦不住被注入的脚本,max-age=0 的 HSTS 会直接关闭 HSTS——两者都「存在」,却都不起作用。存在与生效是两件事,只有生效才值得评分。
会获取页面内容吗?
不会。请求在服务器端发起,响应头一到即中止正文读取。页面内容不会保存也不会返回,私有地址、回环地址与链路本地地址在建立连接前即被拒绝。
会跟随重定向吗?
最多跟随五跳,且每一跳都重新执行同样的地址判定,因此公开 URL 无法把请求重定向进您的内网。评分对象是最终响应的响应头——通常这正是您想知道的,因为浏览器实际应用的就是那一个响应。
我的 CSP 同时含有 'unsafe-inline' 和 hash,会被扣分吗?
不会。只要 script-src 中出现任一 nonce 或 sha256/384/512 值,理解它们的浏览器就会完全忽略 'unsafe-inline'。这是规范特意设计的迁移路径,因此该组合按严格配置评分。
为什么只有 X-Frame-Options 拿不到满分?
因为 CSP 的 frame-ancestors 已取代它。X-Frame-Options 在现行的所有浏览器中仍然有效,所以得 60 分而非 0 分;但 ALLOW-FROM 得 0 分,因为现行浏览器从未实现过它,依赖它的页面实际上可被嵌入。
应该以哪个等级为目标?
A 表示所有响应头都已设置,且每个取值都在发挥作用。B 与 C 通常意味着缺少一个重要响应头,或某个取值过于宽松。低于此,请把报告当作检查清单而不是等级来读——每一项的备注都指出具体的暴露面。