如何构建自动数据脱敏的异步API拦截器,利用Proxy劫持返回值?
- 内容介绍
- 文章标签
- 相关推荐
本文共计838个文字,预计阅读时间需要4分钟。
不能直接使用 +Proxy+ 捕获异步 API(如 fetch、XMLHttpRequest)的返回值本身,因为 Promise 实例不可代理,且 resolve/reject 值是运行时动态生成的。正确的方式是:
聚焦入口劫持,而非代理返回值
异步 API 的“返回值”本质是 Promise,而 Promise.prototype 是不可写、不可配置的;Proxy 只能代理对象,无法拦截 Promise 状态变更或 .then() 内部值。因此必须前移到发起阶段:
- 重写 window.fetch:保存原函数,用新函数包裹,在 response.clone().json() 或 .text() 后对解析出的 JS 对象/字符串执行脱敏
- 打补丁 XMLHttpRequest.prototype.send:监听 onload 事件,在 this.response 可读后,根据 responseType 判断是否需 JSON 解析再脱敏
- 不劫持 Promise.then 或全局微任务队列——易引发递归、污染第三方库、破坏错误堆栈
结构化脱敏:按字段路径匹配 + 白名单驱动
自动脱敏不是简单替换字符串,而是基于响应数据结构进行精准字段识别与掩码。
本文共计838个文字,预计阅读时间需要4分钟。
不能直接使用 +Proxy+ 捕获异步 API(如 fetch、XMLHttpRequest)的返回值本身,因为 Promise 实例不可代理,且 resolve/reject 值是运行时动态生成的。正确的方式是:
聚焦入口劫持,而非代理返回值
异步 API 的“返回值”本质是 Promise,而 Promise.prototype 是不可写、不可配置的;Proxy 只能代理对象,无法拦截 Promise 状态变更或 .then() 内部值。因此必须前移到发起阶段:
- 重写 window.fetch:保存原函数,用新函数包裹,在 response.clone().json() 或 .text() 后对解析出的 JS 对象/字符串执行脱敏
- 打补丁 XMLHttpRequest.prototype.send:监听 onload 事件,在 this.response 可读后,根据 responseType 判断是否需 JSON 解析再脱敏
- 不劫持 Promise.then 或全局微任务队列——易引发递归、污染第三方库、破坏错误堆栈
结构化脱敏:按字段路径匹配 + 白名单驱动
自动脱敏不是简单替换字符串,而是基于响应数据结构进行精准字段识别与掩码。

