前端联调时随手 console.log 了一下用户列表,返回对象里带着 password_hash、id_card 和完整手机号,接口文档里根本没提过这几个字段。乍看像缓存或者权限的锅,追下去往往不是。

SELECT id, nickname, phone FROM users WHERE id = ?;
# 出参改用 VO,实体不要直接序列化

追下去是这么回事:查询直接 select 了实体全部字段,序列化又把所有 getter 吐出去,脱敏只在页面展示层做,接口这一层谁拿到响应都能看到明文,抓包或者调试器里一览无余。

「接口字段脱敏」这类改动最怕改一半,回滚脚本先准备好,再动生产。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

具体做法是,查询的时候明确写出需要的字段名,不要图省事直接 select 星号;响应对象单独定义一个 VO,敏感字段默认就不要出现在里面;确需展示就在服务端脱敏之后,再拼进返回对象。

验收就看一点,抓包看列表接口的响应里已经没有 password 和完整手机号,页面展示照常。

作者 9823189