HAR 文件是网页和服务器之间全部对话的完整录音:每个请求、每个响应、每个请求头,很多时候还有每个请求体和响应体。所以要弄清一个网站实际调用了哪些接口,HAR 是最快的入口。也正因为如此,它是开发者手里最敏感的文件之一:同一份录音里躺着会话 cookie、Bearer token,还有各种个人数据。
这个工具把 HAR 文件,或者 Fiddler Classic 保存的 .saz 归档,整理成一份“保留结构、丢掉秘密”的接口摘要。你会看到:访问了哪些域名、每个接口的路径模板、GraphQL 操作和 tRPC 过程、请求体和响应体的 JSON 结构,以及每个接口用到了哪些凭据的名字。你看不到任何一个值。抓包文件在你的浏览器里解析,不会上传。
使用步骤
- 先录下流量:在 Chrome DevTools 打开 Network 面板,勾选 Preserve log,复现问题后选择导出 HAR;Fiddler Classic 则把会话保存成
.saz归档。各浏览器的具体步骤见下文。 - 把
.har或.saz文件拖到上方的拖放区,或点“选择文件”。 - 先看总览(请求数、接口数、发往其他站点的请求占比),再看域名,然后展开某个接口行,查看它的查询参数名、凭据名称和 JSON 结构。
真实输出示例
我们用 Playwright 录下 Chromium 依次打开本站工具列表页和本页的 HAR,在这里打开,再把页面显示的结果复制下来。排版做了压缩(标签和值放在同一行,表格重新对齐,域名和路径合并),所有值都原样保留。耗时来自那一次录制。
样本: 2026-11-02 用 Playwright 1.63.0(Chromium)录制的 https://rea-reverse.com/tools/ 与 /tools/har-analyzer/ 的 HAR,共 20 个请求
总览
格式 HAR
录制工具 Playwright 1.63.0
文件大小 441.6 KB
请求数 20
接口数 11
第一方(请求最多的站点) rea-reverse.com
发往其他站点的请求 50%
流量 发送 8.8 KB,接收 200.6 KB
域名 (4)
域名 请求数 流量 归属
rea-reverse.com 10 37.1 KB 第一方
fonts.gstatic.com 6 169.9 KB 第三方
fonts.googleapis.com 2 2.4 KB 第三方
static.cloudflareinsights.com 2 0 B 第三方
接口 (11)
方法 路径模板 次数 状态码 耗时(平均 / 最大) Content-Type
GET fonts.gstatic.com/l/font 6 200×6 178 / 597 ms text/html
GET fonts.googleapis.com/css2 2 200×2 125 / 249 ms text/css
GET rea-reverse.com/cdn-cgi/speculation 2 200×2 82 / 85 ms application/speculationrules+json
GET static.cloudflareinsights.com/beacon.min.js/{token} 2 -1×2 0.1 / 0.2 ms other
GET rea-reverse.com/_astro/har-worker-Baso6wJ6.js 1 200×1 430 / 430 ms application/javascript
…
GET rea-reverse.com/tools/ 1 200×1 507 / 507 ms text/html
GET rea-reverse.com/tools/har-analyzer/ 1 200×1 350 / 350 ms text/html能做什么
输入。 HAR 1.2 文件(JSON 格式,Chrome、Firefox、Safari、Charles 等工具导出的都可以),或者 Fiddler 会话归档 .saz(本质是 ZIP)。格式根据文件开头的字节自动判断,扩展名无所谓。上限:单个文件 256 MiB,最多分析 20 万条请求(超出部分丢弃并给出警告),分析超时时间 2 分钟。SAZ 归档里单个成员解压后不超过 64 MiB,所有成员合计不超过 512 MiB。
报告。 摘要包括:
- 总体数字:请求数、不同接口的数量、请求和响应的字节数,以及 HAR 里记录的生成工具(例如 “Chrome 140”)。
- 域名:每个 host 的请求数、字节数,以及它算第一方还是第三方。第一方站点取请求数最多的那个可注册域名;报告会给出发往第三方站点的请求占比。
- 接口:按方法、host 和路径模板分组。路径里像 id 的段会被替换成占位符,所以
/api/users/42/orders和/api/users/97/orders合并成一行/api/users/{id}/orders。每个接口列出请求次数、各个 HTTP 状态码的次数、平均和最大耗时、请求和响应的 Content-Type,以及查询参数的名字。 - GraphQL 操作:发往 GraphQL 接口的请求按操作拆开,显示为
query GetUser、mutation Login这样的形式,批量请求也能识别。只保留操作类型和操作名,查询文本和 variables 一概不留。 - tRPC 过程:能识别
/api/trpc/user.getById,post.list这种路径,列出其中的过程名。 - JSON 结构:对 2 MiB 以内的 JSON 请求体和响应体,提取键名和值的类型(例如
string、number|null、数组、嵌套对象),每个接口最多合并 20 个样本。结构最多 6 层、每个对象最多 64 个键、总共最多 512 个节点。 - 凭据:每个接口的认证面,形式是“名字 +
[已脱敏]+ 最长值的长度”(导出的 JSON 里统一写作[REDACTED])。Authorization头会保留Bearer、Basic这类 scheme 单词;如果值是 JWT,会单独标出来。 - 警告:被跳过的内容的计数,例如非 HTTP 的 URL(
data:、blob:、WebSocket)、Fiddler 的 CONNECT 隧道、格式不对的会话、被截断的列表等。
报告可以导出为 JSON。导出的就是这份已脱敏的报告,所以它可以附到工单里,原始 HAR 则不行。导出文件里会带上你打开的文件名,但它只留在你的设备上。
怎样得到 HAR 或 SAZ 文件
只抓你有权记录的网站和账号的流量,最好用测试账号。
Chrome 及其他 Chromium 浏览器
- 按 F12 打开开发者工具,切到 Network(网络) 面板,勾选 Preserve log,避免页面跳转时列表被清空。
- 刷新页面,做你想记录的操作。
- 点击 Network 面板顶部操作栏里的下载图标,选 Export HAR (sanitized)…。也可以在任意一条请求上右键,选 Copy > Save all as HAR (sanitized)。
从 Chrome 130 开始,默认导出的 HAR 不再包含 Cookie、Set-Cookie 和 Authorization 这三类请求头。如果需要把它们也导出,打开 Settings > Preferences > Network,勾选 Allow to generate HAR with sensitive data,导出菜单里就会多出 Export HAR (with sensitive data)。从 Chrome 133 开始,单击导出按钮就会弹出这个菜单(之前要长按)。
对这个工具来说,脱敏版导出通常就够用了:接口、JSON 结构、查询参数名都还在。区别只在于被删掉的请求头不会出现在凭据列表里。如果你想知道哪些接口带了 cookie 或 Authorization 头,就导出含敏感数据的版本,在这里分析完,再把这个 HAR 删掉。
Firefox
- 打开开发者工具,切到 网络(Network) 面板。如果希望刷新后记录不丢,在设置菜单里打开 Persist Logs(中文界面里叫法可能略有不同)。
- 做你要记录的操作。
- 在请求列表上右键,选 Save All As HAR;网络面板工具栏的“其他操作”菜单里也有同样的选项。
Firefox 没有 Chrome 那样的默认脱敏步骤,请当作它导出的 HAR 什么都包含。
Fiddler Classic
- 启动 Fiddler。要看到 HTTPS 的内容,需要在 Tools > Options > HTTPS 里勾选 Decrypt HTTPS traffic,并信任 Fiddler 的根证书,最好在测试机上做。
- 产生你要记录的流量。
- 选 File > Save > All Sessions…,保存为
.saz文件。不要设置密码:本工具不支持加密的归档。
原理
文件在 Web Worker 里读取。HAR 用 JSON.parse 解析,再按 HAR 1.2 的结构检查(必须有 log.entries,每条要有请求方法、URL 和响应状态码)。SAZ 按 ZIP 打开:每个会话的原始请求在 raw/NN_c.txt,原始响应在 raw/NN_s.txt,工具把它们拆成起始行、头部和 body,解开 chunked 编码,再从 raw/NN_m.xml 的 SessionTimers 元素里算出耗时。SAZ 头部和 body 的切分方式参考了 REA(morluto 的开源项目,MIT 许可)main 分支上的 SAZ 读取实现;这部分还不在 REA 6.4.0 的 npm 发布版里。
每个请求先被统一成方法、URL、状态码、头部、Content-Type,以及(仅限 JSON 类 body 的)正文文本。然后汇总成报告,值在这个过程中被丢掉:
- 路径按段切开。整段是纯数字、UUID、JWT、日期、长十六进制串、邮箱地址,或者像随机 token 的字符串时,分别替换成
{id}、{uuid}、{jwt}、{date}、{hex}、{email}、{token}。查询字符串和 fragment 直接丢掉。 - 请求头或查询参数满足以下任一条件就算凭据:名字是
authorization、proxy-authorization、cookie、set-cookie、x-api-key;名字里含有token、secret、password、session、key、auth、signature、credential这类词;或者值本身是 JWT。cookie 按 cookie 名逐个列出。 - 本身长得像值的名字(例如纯数字的 JSON 键)也会被替换成同样的占位符。
- JSON body 在存储任何东西之前就被归约成“键 + 类型”。
隐私是怎么保证的
抓包文件不会被上传:
- 分析器运行在一个单独的框架(iframe)里,来源是
tools.rea-reverse.com。下面说的处理都在这个框架里、在你的设备上完成。 - 这个页面在正文之后展示一个广告。广告脚本运行在
rea-reverse.com上,而框架属于另一个源(origin),浏览器不允许广告脚本或本页的任何其他脚本读取你拖入的抓包文件或结果。 - 框架的内容安全策略拦截它的脚本能发起的所有请求(
connect-src 'none',也不加载任何第三方资源)。框架不能自行打开窗口或让本页跳转;只有你点击报告里的链接时才会打开页面。它传给本页的只有自身高度和下面这些统计事件。 - 解析和汇总都在你设备上的 Web Worker 里进行,只有最终那份已脱敏的报告会传回工具。
- 报告从不存储请求头、cookie、查询参数或 body 的值。脱敏是“结构上就不存”,而不是“先复制再打码”。
- 统计事件只有粗粒度信息:成功或错误码、接口数量区间(例如
11-100)、文件大小区间、耗时区间,绝不包含文件名、域名、路径或任何其他内容。框架把事件交给本页,由本页发送。完整清单见隐私政策。 - 不想要任何广告和统计?在单独页面打开分析器。
如何自己验证
- 打开浏览器开发者工具的 Network(网络) 面板,加载本页。发往
tools.rea-reverse.com的请求就是框架:它的 HTML、样式、字体和脚本,以及 Worker 脚本/_astro/har-worker-*.js。发往 Google 域名的请求是本页的广告。 - 清空日志,然后分析一个抓包文件。在过滤框里输入
domain:tools.rea-reverse.com:最多只会再出现一次 Worker 脚本/_astro/har-worker-*.js(为下一次运行准备的新 Worker),没有任何请求带着你的数据。广告请求可能还会继续,但它们来自本页,不带框架里的任何内容。 - 点开来自
tools.rea-reverse.com的har-analyzer/文档,查看 Headers:它的Content-Security-Policy里有connect-src 'none'和frame-ancestors https://rea-reverse.com。在 Chrome 里,Application(应用)> Frames 也能看到框架的源和策略。Worker 运行在default-src 'none'; script-src 'self'; connect-src 'none'这条策略下,浏览器不允许它发出任何网络请求。 - 检查隔离:在 Console(控制台) 里,上下文选
top,运行document.getElementById('tool-frame').contentDocument,结果是null;frames[0].document会抛出SecurityError。广告脚本拿到的也是这个结果。 - 或者先打开页面再断网(关掉 Wi-Fi,或在 Network 面板勾选 Offline),然后分析文件,照样能用。
局限
- 故意看不到值。 这里读不到 token、cookie 或响应内容,需要的话请用浏览器自己的工具。
- 占位符是启发式的。
order-12345这样的普通 slug 会原样保留,同一个接口可能因此出现多行;反过来,普通单词段永远不会被当成 id。 - 第一方是推测的。 取请求数最多的可注册域名,计算时只用了一份很小的内置二级后缀表(如
co.uk),不是完整的 Public Suffix List。 - 部分 body 不分析。 只对 2 MiB 以内的 JSON 类 body 提取结构。HAR 里以 base64 存储的响应、SAZ 里经过 gzip 或 br 压缩的 body,都没有结构。
- SAZ 的限制。 加了密码的归档、ZIP64 归档,以及 Fiddler 没有解密的 HTTPS 流量(只表现为 CONNECT 隧道)都无法归纳。请求行只有路径(origin form)时,默认按 HTTPS 处理。
- 不看 WebSocket 帧,也不重放。 工具只汇总 HTTP 请求和响应,自己从不发出请求。
- HAR 只记录了你触发过的东西。 抓包期间没有调用到的接口,不会出现在报告里。
合规说明
请只分析你自己的流量、你拥有的系统,或者你获得授权测试的系统的抓包,并遵守目标网站的条款和适用于你的法律法规。HAR 文件里可能有他人的个人数据,请妥善处理,用完即删。另见免责声明。
对应的命令行
用 jq 1.7.1 得到同样的数字。文件由谁写出:
$ jq -r '.log.creator | "\(.name) \(.version)"' rea-reverse.com.har
Playwright 1.63.0每个域名的请求数,与“域名”表一致:
$ jq -r '.log.entries[].request.url' rea-reverse.com.har | awk -F/ '{print $3}' | sort | uniq -c | sort -rn
10 rea-reverse.com
6 fonts.gstatic.com
2 static.cloudflareinsights.com
2 fonts.googleapis.com常见问题
怎样在线查看 HAR 文件,又不上传?
把文件拖到本页。抓包在你的浏览器里解析,页面只显示脱敏后的摘要:请求头、cookie、查询参数和 body 的值从不显示也不保存,只保留名字、类型、次数和长度。
分享 HAR 之前怎样脱敏?
分享本页导出的脱敏 JSON,而不是 HAR 本身:它保留域名、路径模板、名字和结构,去掉了所有值。如果一定要分享 HAR,请在 Chrome 里用“Export HAR (sanitized)”导出,它会去掉 Cookie、Set-Cookie 和 Authorization。
导出的脱敏报告可以随便分享吗?
里面没有任何请求头、cookie、查询参数或 body 的值,只有名字、类型、次数和长度。但它仍然暴露了域名、路径模板和接口结构,还带着你打开的文件名,所以请只在可以接受这些信息的场合分享。
能打开 Fiddler 的 SAZ 文件吗?
能。Fiddler Classic 的 .saz 归档和 HAR 一样读取,Fiddler Everywhere 用的也是同一套结构。设置了密码的归档会被拒绝。
为什么凭据列表里没有 cookie?
多半是因为你的 HAR 来自 Chrome 默认的脱敏导出,它删掉了 Cookie、Set-Cookie 和 Authorization。见上文 Chrome 一节。
超过 256 MiB 的 HAR 能打开吗?
不能。请在导出前先过滤,例如只保留 Fetch/XHR 请求。
更新于
相关教程
- HAR 文件查看与分析:读懂抓包、归纳接口,安全地分享给别人:各浏览器的导出方法、怎么读这份报告,以及分享抓包前要检查什么。
- 用 REA 逆向分析 Electron 应用:ASAR、preload 与 IPC 全流程:基于 Web 技术的桌面应用用的是同一类接口;它们内部的通道可以用 ASAR 与 Electron IPC 分析器梳理。