安全
密钥保护
保护 AI、短信、邮件、支付和数据库密钥,避免额度、账单和数据被滥用
哪些东西不能公开
凡是能让别人代表你调用服务、扣你的钱、访问你的数据的值,都不能公开。下面这些都不能出现在前端代码、公开仓库、截图、日志和构建产物里:
DATABASE_URLBETTER_AUTH_SECRETOPENAI_API_KEY/AI_API_KEY- 短信、邮件、对象存储的 Secret Key
- 支付渠道的通知密钥和私钥
- OAuth provider 的 client secret
- Cloudflare Turnstile secret key
可以出现在前端的只应该是明确设计为公开的值,例如 NEXT_PUBLIC_* 里的 site key、publishable key 或公开 endpoint。即便名字以 NEXT_PUBLIC_ 开头,也要确认它不是服务端 secret。
默认做法
| 场景 | 做法 |
|---|---|
| 本地开发 | 使用 .env.local,不要提交 |
| 生产部署 | 使用 Zeabur、Vercel、Cloudflare 等平台的环境变量或 Secret 管理 |
| Docker 构建 | 不要把真实密钥放进 --build-arg,运行容器时再注入 |
| CI | 使用仓库 Secret,不在日志里 echo |
| 第三方回调 | 验证签名、金额、订单状态和幂等记录 |
提交前运行:
pnpm security:check -- --strict这个检查不能替代人工判断,但能拦住常见的真实密钥、危险配置和生产环境误配。
泄露后会怎样
| 泄露对象 | 常见后果 | 处理 |
|---|---|---|
| AI API key | 模型费用被刷,额度被打空 | 立刻在 provider 后台轮换,检查账单和调用日志 |
| 短信 Secret | 短信费用暴涨,手机号被骚扰 | 轮换密钥,收紧短信接口限流,查看发送记录 |
| 邮件 Secret | 垃圾邮件发送、发信域名信誉下降 | 轮换密钥,检查发信日志和退信率 |
| 对象存储 Secret | 文件被读取、覆盖或删除 | 轮换 Access Key,检查 bucket 权限和对象变更 |
| 支付通知密钥 | 伪造支付成功或退款事件 | 轮换密钥,复查订单、金额和支付通知日志 |
| 数据库连接串 | 数据被读取或篡改 | 立刻吊销账号,轮换密码,查审计日志和备份 |
泄露后的处理顺序
- 在服务商后台禁用或轮换泄露的 key。
- 更新生产环境变量并重新部署。
- 搜索代码、提交历史、日志和文档,确认没有继续暴露。
- 查看服务商账单、调用日志、支付通知日志和数据库审计。
- 如果密钥进过 Git 历史,不要只改最新提交;把该 key 当作永久泄露处理。
配置反例
# 不要这样:真实服务端密钥会进入前端包
NEXT_PUBLIC_OPENAI_API_KEY=sk-...
# 不要这样:真实密钥会进入 Docker 构建历史
docker build --build-arg OPENAI_API_KEY=sk-...