安全

密钥保护

保护 AI、短信、邮件、支付和数据库密钥,避免额度、账单和数据被滥用

哪些东西不能公开

凡是能让别人代表你调用服务、扣你的钱、访问你的数据的值,都不能公开。下面这些都不能出现在前端代码、公开仓库、截图、日志和构建产物里:

  • DATABASE_URL
  • BETTER_AUTH_SECRET
  • OPENAI_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 权限和对象变更
支付通知密钥伪造支付成功或退款事件轮换密钥,复查订单、金额和支付通知日志
数据库连接串数据被读取或篡改立刻吊销账号,轮换密码,查审计日志和备份

泄露后的处理顺序

  1. 在服务商后台禁用或轮换泄露的 key。
  2. 更新生产环境变量并重新部署。
  3. 搜索代码、提交历史、日志和文档,确认没有继续暴露。
  4. 查看服务商账单、调用日志、支付通知日志和数据库审计。
  5. 如果密钥进过 Git 历史,不要只改最新提交;把该 key 当作永久泄露处理。

配置反例

# 不要这样:真实服务端密钥会进入前端包
NEXT_PUBLIC_OPENAI_API_KEY=sk-...

# 不要这样:真实密钥会进入 Docker 构建历史
docker build --build-arg OPENAI_API_KEY=sk-...

相关链接