前端如何避免用户隐私数据被意外泄露?

天瑞 Dev 阅读 19

最近在做用户信息展示功能,发现控制台打印了包含手机号和身份证的完整对象,担心这些敏感字段会被不小心传到日志或错误上报系统里。有没有办法在开发阶段就自动过滤掉这些字段?

我试过在输出前手动删字段,但每次都要写一堆 delete,太麻烦了。比如下面这段代码:

const user = {
  name: '张三',
  phone: '13800138000',
  idCard: '11010119900307XXXX',
  email: 'zhangsan@example.com'
};

// 手动删除太繁琐
delete user.phone;
delete user.idCard;
console.log(user); // 只想看非敏感信息

有没有更优雅的方式,比如定义一个白名单,自动剥离敏感字段?或者用 Proxy 拦截?

我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
打工人夏沫
这个问题我太熟悉了,之前也踩过类似的坑,确实手动删字段太容易漏,而且一不小心就打到控制台或者上报到监控系统里去了。

我用过几种方式,分享一个比较实用的方案:用一个专门的工具函数做脱敏处理,配合白名单机制。核心思路就是只保留你真正想看的字段,其他一概过滤掉。

比如你可以写个 sanitizeObject 函数:

function sanitizeObject(obj, whitelist = ['name']) {
if (obj == null || typeof obj !== 'object') {
return obj;
}

if (Array.isArray(obj)) {
return obj.map(item => sanitizeObject(item, whitelist));
}

const result = {};
for (const key of whitelist) {
if (key in obj) {
result[key] = obj[key];
}
}
return result;
}

// 使用示例
const user = {
name: '张三',
phone: '13800138000',
idCard: '11010119900307XXXX',
email: 'zhangsan@example.com'
};

console.log(sanitizeObject(user, ['name']));
// 输出:{ name: '张三' }

// 也可以配合 console.log 用
console.log('调试信息:', sanitizeObject(user, ['name', 'email']));


如果你是想在所有 console.log 调用时都自动脱敏,还可以封装一层:

const safeLog = (...args) => {
const sanitizedArgs = args.map(arg => sanitizeObject(arg, ['name']));
console.log(...sanitizedArgs);
};

// 这样就不用改原来的 console.log,统一替换成 safeLog 即可
safeLog('当前用户:', user);


另外,如果你用的是 Node.js 环境,还可以通过重写 console.log 来全局拦截,不过这个风险高点,容易误伤其他正常日志,不太推荐。

还有一种更激进的做法是用 Proxy 做只读 + 字段过滤,不过调试起来可能反而更绕,尤其是你不确定哪些字段会被访问时,容易漏。

最后提醒一句:生产环境里尽量别在前端打敏感字段的日志,像 phoneidCard 这些字段,后端上报错误时也最好提前过滤一遍,我见过有人把整个 error 对象直接上报的,结果把 stack trace 里的变量名都带上去了……惨痛教训啊。

希望能帮到你,试试这个 sanitizeObject 方案,简单好用,也不用动太多代码。
点赞
2026-02-25 23:04