排查下载慢的时候顺手翻了半小时访问日志,几乎每行都带着 ?token=eyJhbGciOi,同一个值还被 Referer 头带到了第三方统计域名上。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
# 统计日志里带 token 的请求
awk '/token=/{c++} END{print c}' /var/log/nginx/access.log
# 日志格式改用 $uri,别用 $request
查询参数会原样写进服务端访问日志、浏览器历史和 Referer,链路上任何一处记录或转发都等于把凭据公开,事后删日志也追不回来。这一点先确认清楚,后面就不用反复试。
「token 泄漏日志」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,鉴权的信息统一放到 Authorization 头里,不要再拼到地址栏参数上;日志格式里把 query 整段剔除掉,或者把 token 的值统一打成掩码;判定已经泄漏的凭据立即作废,不要只改代码就当作处理完。
改完照着核一遍,翻日志和 Referer 头部都不再出现明文 token,再拿旧 token 调接口确认已经返回 401。
