← 中文资源

简体中文版本

测试日志敏感字段脱敏

添加自动化测试,捕获结构化日志输出,断言邮箱、令牌和卡号不会以明文出现。

阅读英文原文

概述

日志会落盘、被采集、被索引并长期保留。日志行中泄露的邮箱或令牌会绕过所有数据库访问控制。脱敏必须自动化并被测试覆盖,因为失败是静默的:应用照常工作,只有日志内容出了问题。

步骤

  1. 集中配置脱敏路径,让所有 logger 实例共享同一策略:
export const logger = pino({
  redact: {
    paths: ['req.headers.authorization', 'user.email',
            'payment.card.number', 'err.context.email'],
    censor: '[REDACTED]',
  },
});
  1. 在测试中捕获序列化后的字符串,断言原始值不出现:
const output = lines.join('');
assert.equal(output.includes('[email protected]'), false);
assert.equal(output.includes('sk_live_abc123'), false);
  1. 在 CI 中增加针对日志样本的正则扫描,检查邮箱等常见 PII 形态。
  2. 故意删除一条脱敏路径运行测试,确认失败后再恢复。

验证

预期测试在脱敏生效时通过,删除路径后失败并指出泄露的值。CI 的 grep 门禁在样本包含邮箱时返回非零,样本清理后输出 no email patterns found。

注意事项

  • 断言序列化后的字符串,而不是 logger 配置对象,回归通常发生在序列化阶段。
  • 错误对象和自定义 serializer 最容易绕过脱敏,必须单独测试错误路径。
  • 字段级脱敏无法覆盖自由文本消息,需要正则扫描作为第二层。
  • 访问日志和崩溃上报也要使用同一策略,否则会抵消应用日志的脱敏效果。