安全同学把 dist 目录丢进扫描工具,两分钟就在 app.9f3c.js 里搜出 sk_live_ 开头的字符串,拿 curl 直接调通了按次计费的接口。乍看像缓存或者权限的锅,追下去往往不是。

grep -rn 'sk_live_' dist/ | head
# 构建时不产出 source map
GENERATE_SOURCEMAP=false npm run build

追下去是这么回事:密钥写进前端环境变量只是编译时替换成字面量,产物对所有人可读,source map 没关的话连原始变量名和调用位置都能还原出来。

「API Key 前端暴露」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,把第三方的接口调用挪到自己后端做一次代理转发,密钥只留在服务端;前端只保留公开的标识类 key,不要在里面放任何 secret 字段;重新签发一对新密钥,并把旧的那一个立刻停用。

验收就看一点,在构建产物里已经搜不到密钥字符串,拿旧 key 调用接口确认会返回 401 状态码。

作者 9823189