前端日志和埋点如何避免泄露敏感信息?
简化版
前端日志和埋点常会采集 URL、接口错误、用户行为、设备信息和异常栈,如果不脱敏,可能泄露 token、手机号、身份证、邮箱、地址、订单号等敏感信息。安全做法是最小采集、字段白名单、URL 参数过滤、错误信息脱敏、禁止上报请求头中的认证信息,并控制日志平台权限、采样率和保留时间。
详细版
前端监控很容易“顺手多采”,但浏览器端数据常含用户隐私。
| 数据 | 风险 | 处理 |
|---|---|---|
| URL | query 中含 token/手机号 | 参数白名单或黑名单过滤 |
| 请求头 | Authorization/Cookie | 禁止上报 |
| 表单值 | 隐私和账号信息 | 默认不采 |
| 错误栈 | 文件路径和业务信息 | 过滤和权限控制 |
function sanitizeUrl(raw: string) {
const url = new URL(raw, location.origin)
for (const key of [...url.searchParams.keys()]) {
if (!['page', 'tab'].includes(key)) url.searchParams.set(key, '***')
}
return url.pathname + url.search
}
日志安全的原则是:先问有没有必要采,再问怎么脱敏,而不是先全量上报。
完整版教学
一、为什么前端日志容易泄露
前端监控 SDK 往往会自动采集页面 URL、错误栈、接口地址、用户行为和设备信息。业务为了排查方便,也可能把接口参数、表单内容或响应体打进日志。
这些信息进入第三方监控平台后,访问范围、存储时间和合规风险都会扩大。
二、敏感信息有哪些
常见敏感信息包括:
- token、session、Authorization。
- 手机号、邮箱、身份证。
- 地址、姓名、银行卡。
- 订单号、支付流水。
- 医疗、教育、金融等行业敏感字段。
不同业务要有自己的敏感字段清单。
三、最小采集原则
不要默认采完整请求和响应。排查性能和错误通常只需要状态码、耗时、接口路径、错误类型和 traceId。
| 目的 | 足够字段 |
|---|---|
| 性能分析 | 路径、耗时、状态码 |
| 错误定位 | 错误类型、栈、版本号 |
| 用户影响 | 匿名用户 ID、页面路径 |
| 链路追踪 | traceId、requestId |
四、URL 参数过滤
URL 是泄露高发区。很多系统把 token、邀请码、手机号或搜索词放 query 里。
建议使用白名单保留必要参数,其他参数统一替换。
const allowed = new Set(['page', 'tab', 'sort'])
白名单比黑名单稳,因为你不一定知道未来会新增什么敏感参数。
五、错误信息脱敏
错误对象里可能包含接口参数、响应体和用户输入。上报前应统一 sanitize。
function mask(value: string) {
return value
.replace(/1\d{10}/g, '手机号***')
.replace(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+/g, '邮箱***')
}
正则脱敏只是兜底,根本还是不要采敏感字段。
六、平台权限和保留时间
即使前端做了脱敏,日志平台也要控制权限。不是所有开发、测试、运营都应该看到原始日志。
还要设置保留时间、审计访问记录和导出限制,避免日志变成长期敏感数据库。
七、常见误区与追问
- 误区:日志只给内部看,不算泄露。 内部系统也有权限、合规和误导出风险。
- 误区:脱敏靠几个正则就够。 正则只能兜底,更关键是字段白名单和最小采集。
- 误区:前端埋点不采密码就安全。 URL、错误栈、请求参数和用户行为也可能敏感。
- 追问:为什么白名单优于黑名单? 新增敏感字段时黑名单容易漏,白名单默认不采更安全。
- 追问:Authorization 能不能上报? 不能,认证凭证应完全禁止进入日志。
- 追问:如何兼顾排查效率? 用 traceId、版本号、状态码和脱敏后的上下文定位,再按权限临时查后端安全日志。
八、加强记忆
前端日志安全记成“少采、脱敏、控权”。URL 参数、请求头、表单值和错误上下文最容易出事;排查问题靠 traceId,不靠把用户隐私全传上去。