HAR 文件是网页和服务器之间全部对话的完整录音:每个请求、每个响应、每个请求头,很多时候还有每个请求体和响应体。所以要弄清一个网站实际调用了哪些接口,HAR 是最快的入口。也正因为如此,它是开发者手里最敏感的文件之一:同一份录音里躺着会话 cookie、Bearer token,还有各种个人数据。
这个工具把 HAR 文件,或者 Fiddler Classic 保存的 .saz 归档,整理成一份“保留结构、丢掉秘密”的接口摘要。你会看到:访问了哪些域名、每个接口的路径模板、GraphQL 操作和 tRPC 过程、请求体和响应体的 JSON 结构,以及每个接口用到了哪些凭据的名字。你看不到任何一个值。抓包文件在你的浏览器里解析,不会上传。
能做什么
输入。 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 在存储任何东西之前就被归约成“键 + 类型”。
隐私是怎么保证的
抓包文件不会被上传:
- 解析和汇总都在你设备上的 Web Worker 里进行,只有最终那份已脱敏的报告会传回页面。
- 报告从不存储请求头、cookie、查询参数或 body 的值。脱敏是“结构上就不存”,而不是“先复制再打码”。
- 统计事件只有粗粒度信息:成功或错误码、接口数量区间(例如
11-100)、文件大小区间、耗时区间,绝不包含文件名、域名、路径或任何其他内容。完整清单见隐私政策。 - 工具页不展示广告。
如何自己验证
- 在选择文件之前,打开浏览器开发者工具,切到 Network(网络) 面板。分析一个抓包文件,逐条查看出现的请求:只有页面资源和 worker 脚本
/_astro/har-worker-*.js,没有任何一条带着你的文件。 - 或者先打开本页,然后断开网络(关闭 Wi-Fi,或在 Network 面板勾选 Offline),再分析文件,照样能完成。
- Worker 运行在
default-src 'none'; script-src 'self'; connect-src 'none'这条内容安全策略之下,浏览器根本不允许它发出网络请求。
局限
- 故意看不到值。 这里读不到 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 只记录了你触发过的东西。 抓包期间没有调用到的接口,不会出现在报告里。
常见问题
导出的脱敏报告可以随便分享吗?
里面没有任何请求头、cookie、查询参数或 body 的值,只有名字、类型、次数和长度。但它仍然暴露了域名、路径模板和接口结构,还带着你打开的文件名,所以请只在可以接受这些信息的场合分享。
为什么凭据列表里没有 cookie?
多半是因为你的 HAR 来自 Chrome 默认的脱敏导出,它删掉了 Cookie、Set-Cookie 和 Authorization。见上面 Chrome 一节。
支持 Fiddler Everywhere 吗?
解析器按 SAZ 的目录结构读取,Fiddler Everywhere 保存的 SAZ 用的是同一套结构。设置了密码的归档会被拒绝。
为什么某个 GraphQL 请求显示为 anonymous?
这个查询没有写操作名,只能知道它是 query、mutation 还是 subscription。
超过 256 MiB 的 HAR 能打开吗?
不能。请在导出前先过滤,例如只保留 Fetch/XHR 请求。
合规说明
请只分析你自己的流量、你拥有的系统,或者你获得授权测试的系统的抓包,并遵守目标网站的条款和适用于你的法律法规。HAR 文件里可能有他人的个人数据,请妥善处理,用完即删。另见免责声明。
相关教程
- HAR 文件查看与分析:读懂抓包、归纳接口,安全地分享给别人:各浏览器的导出方法、怎么读这份报告,以及分享抓包前要检查什么。
- 用 REA 追踪网站 API 调用:浏览器捕获、HAR 与前端 bundle:从这样一份接口摘要出发,找到前端代码里发起每个调用的位置。
- 用 REA 逆向分析 Electron 应用:ASAR、preload 与 IPC 全流程:基于 Web 技术的桌面应用用的是同一类接口;它们内部的通道可以用 ASAR 与 Electron IPC 分析器梳理。