日志里出现 /reset?token=8f3c... 这样的完整地址,虽然只有一条,但足够把别人的密码改掉,分享报表时这行被一起发了出去。乍看像缓存或者权限的锅,追下去往往不是。
log_format noparam '$remote_addr $request_method $uri $status'; add_header Referrer-Policy 'no-referrer' always;
追下去是这么回事:重置链接把令牌放在 query 里,默认日志格式记录完整 request,令牌就跟着落盘。浏览器历史、Referer 头也会各留一份,删日志也删不干净。
碰到「敏感参数日志」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
具体做法是,把令牌从 query 挪到 URL 片段或表单提交,片段不会发给服务端也不进日志;必须用 query 时,日志格式只保留路径,丢掉参数部分;已发出的令牌全部作废,新链接改成一次性并设十分钟过期。
验收就看一点,重新生成一条重置链接并触发一次,日志里只有路径,grep token 关键字返回空。
