⌘K 切换工具
NETWORK · HAR

HAR文件清洗器

从HAR文件中移除认证令牌・Cookie等敏感数据。

local
har-sanitizer

🖥 Removes cookies, auth headers, tokens, and bodies from a HAR file — entirely in your browser, so secrets never leave your machine.

§01 关于此工具

概述

HAR 文件是浏览器自己记录下来的一次页面加载过程,从 DevTools 导出。它是「在我这里是正常的」这类缺陷报告里你能附上的最有用的东西,同时也是最不该粘进公开 issue 追踪系统的东西之一。一份登录状态下的抓包,包含你的会话 Cookie、你的 Authorization 请求头、当时恰好在传输中的任何 OAuth code、你提交过的每一个表单,以及服务器返回的每一个响应体。

这个工具重写抓包内容,让结构留下来而机密消失。请求列表、方法、状态码、请求头名称、耗时和大小都还在——也就是维护者推理你这个问题所需要的一切——而那些一旦泄露就会危及你账号的值,会被替换为 [REDACTED]

使用方法

  1. 在 DevTools 里打开 Network,右键请求列表,选择 Save all as HAR
  2. 把 JSON 粘贴到这里(或者打开文件,把内容粘进来)。
  3. 先看被脱敏字段的计数,再快速通读一遍输出。
  4. Download 保存 sanitized.har,附件用这个文件,而不是原始文件。

会被移除的内容

同一个机密会在一份抓包里出现在好几个不同的位置,所以工具必须把它们全部清掉。漏掉其中任何一处,才是真正要命的那种失败:一份看起来已经脱敏过的文件,比一份明显没脱敏的文件更危险,因为前者会让你不加思索地就把它附上去。

  • 请求头。 CookieSet-CookieAuthorization,以及任何名称里含有 tokensecretcredentialsessionapi-key 的头。还有 Location,因为 OAuth 回调之后的重定向会把授权码带在 URL 里。
  • 解析后的 cookie 数组。 HAR 会把 cookie 记录两遍——一次是原始的头部行,一次是名值对形式的 cookies[] 数组。这些数组里的每个值都会被清空,不看名称,因为 cookie 的名称并不能说明它的用途(现实中 s_sessSID 都是会话 cookie)。
  • 请求体。 postData.text 和解析后的 postData.params[] 都会被清空,同样不看字段名。登录表单的字段可能叫 passotpcvv,这些名字没有一个会出现在你想得到的关键词列表里。
  • 响应体。 整体清空。这是意外泄露的最大单一来源——比如 /api/me 返回的那个 JSON,里面装着一整条用户记录。
  • 重定向目标和 WebSocket 帧。 response.redirectURL,以及 Chrome 的 _webSocketMessages——它的第一帧十有八九就是认证握手。
  • 服务器 IP 地址和发起方。 serverIPAddress 会暴露内网编址;Chrome 的 _initiator 保存着触发该请求的那个脚本的完整 URL,查询串也在里面。
  • 查询参数。 任何名字像凭据的参数——tokenapi_keyAWSAccessKeyIdsignaturecodestatesid,以及包含 keysecretpassword 的名称。像 pagelang 这样与机密无关的参数会被保留,好让 URL 仍然可读。
  • 页面标题和来源页。 页面标题往往就是 URL 本身,而 OAuth 回调之后的 Referer 头会带着授权码。

刻意保留的内容

有两类内容即使粗暴的关键词过滤会命中,也照样留着,因为删掉它们等于毁掉你分享这个文件的理由:

  • CORS 响应头。 Access-Control-Allow-Origin 及其同类不含任何机密,而 CORS 问题本来就是分享 HAR 最常见的原因之一。把答案本身涂掉,抓包就没用了。
  • 认证挑战。 WWW-AuthenticateProxy-Authenticate 描述的是服务器想要哪种认证方式。那是提示,不是凭据。

这个工具做不到的事

基于名称来判断的脱敏有一个明确的上限,在把输出附到公开 issue 之前,值得先弄清楚这条线画在哪里。

  • 藏在 URL 路径里的机密。 在不了解路由的前提下,/reset/9f3c…/invite/abc123/users/42 没有任何区别。路径片段被原样保留,因为删掉它们会毁掉请求列表。
  • 名字无害的自定义头里的令牌。 一个叫 X-Client-Id 的头,如果恰好携带了签名值,不会命中任何关键词。分享之前请自己扫一遍头名称。
  • 非机密参数里的个人数据。 ?email= 里的邮箱地址会留下来,因为 email 是字段名而不是凭据。这算不算问题,取决于你把文件发给谁。
  • URL 本身。 内网主机名、预发布域名和 API 路径全部保留,它们合起来就描述了你的架构。

实用的判断标准是:这个工具让抓包可以安全地附到厂商工单,或者你自己追踪系统里的 issue。「可以公开发到互联网上」是另一个层面的判断,要靠你自己把文件读一遍来下结论。

说明

这些值是被替换掉而不是被删除,所以 JSON 的形状保持不变,任何 HAR 查看器都还能打开处理后的结果。唯一的例外是 content.encoding:当一个响应体被替换掉时,那个用来描述原始字节的 base64 声明会被一并去掉,因为 [REDACTED] 本身不是 base64,严格的查看器碰到它会直接报错。

计数器报告的是「被清空或移除的字段数」,而不是「找到的机密数」。一份完全没有任何 cookie 的静态站点抓包,也完全有可能报出一个很高的数字,因为每一个响应体都算作一处。

不是 HAR 格式的输入会被直接拒绝,而不是原样放行。这个工具早期的版本会接受任意 JSON,处理了零条记录,然后把「0 sensitive values redacted」当成成功结果报告出来——等于把原始文件连同一份健康证明一起交还给你。这个页面的全部产品价值就在于「告诉你某个东西是安全的」这件事上,所以现在只要缺少 log.entries 数组,工具就会拒绝处理。

如果你只想一份抓包而不是分享它,请用 HAR 查看器。它在屏幕上遮蔽机密,但从不重写文件,因为两种方式下都没有东西离开你的机器。

FAQ
我的抓包会被上传到什么地方吗?
不会。文件通过浏览器的 FileReader 读取,在页面内重写,再作为下载交还给你,整个过程没有任何网络请求。这一点在这里比在多数工具里都更要紧,因为你会来到这个页面,原因恰恰就是文件里有机密。
到底有哪些内容会被移除?
Cookie 和 Set-Cookie 头、Authorization 以及任何名字看起来像凭据的头、请求侧和响应侧解析后的 cookies[] 数组、每一个请求体、每一个响应体、重定向目标、WebSocket 帧、服务器 IP 地址,以及任何名字看起来像机密的查询参数。cookie 名称和请求头名称会保留,这样抓包读起来还像一份抓包。
为什么 cookie 的名称还看得见?
因为名称有诊断价值,而值才是机密。知道某个请求带了 `sessionid` 和 `csrftoken`,往往正是缺陷报告的重点;知道它们的内容是什么,从来都不是。
你把我需要的一个查询参数删掉了,为什么?
脱敏器偏向于删除。一个叫 `licenseKey` 或 `code` 的参数,是凭据的可能性远高于「有人在缺陷报告里需要它」,所以它会被删掉。查看器工具采取相反的立场,几乎什么都显示,因为在那里没有东西离开你的机器。
处理后的结果可以公开发布吗?
更安全,但不等于安全。机密如果藏在 URL 的路径片段而不是查询参数里,靠名称是检测不出来的;一个名字平平无奇的自定义头里携带的令牌,同样检测不出来。附上去之前先把输出读一遍。