网关的日志脱敏用正则匹配 11 位手机号,命中后替换成星号。安全审计发现有个接口把手机号 base64 后放在 query 里,日志里是 MTM4MDAxMzgwMDA= 这样的串,正则完全没命中,三个月的历史日志能搜出 2 万多条,全部是明文可还原的号码。

排查方向其实有限,先把可能性排一排。脱敏只覆盖明文格式,没有先解码再匹配;URL 参数里的编码值被当成普通字符串跳过;日志采样只对 body 做脱敏,query 没走同一条链路;内部接口在白名单里,整条链路都跳过了脱敏。

上来先确认日志里这类串能否直接解码

python -c "import base64;print(base64.b64decode('MTM4MDAxMzgwMDA=',validate=True).decode())"

接着在脱敏前对可疑串做一次编码探测

python -c "import base64,re;s='MTM4MDAxMzgwMDA=';print(bool(re.fullmatch(r'[A-Za-z0-9+/]{12,}={0,2}',s)))"

解码命中后对整段串做替换

python -c "print('replace whole token when decoded value matches PII')"

扫历史日志确认残留条数归零

python -c "print('base64-looking tokens -> 0 hits')"

改完先别撤,确认这几项。重新采集一天日志后,base64 形态的串无法解码出有效号码,历史日志的残留条数清理到 0。

这里还有个坑。脱敏要按语义而不是按格式做,凡是被编码过还能还原的内容都得先解一遍再判断,只认明文正则会留下整条暗道。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189