Vercel 预览部署暴露 API 密钥的真相

作者: Trove Deck Solution 发布: 2026-05-09 阅读时长: 7 分钟

你分享了一个预览 URL——同时广播了你的密钥

你通过 Vercel 预览部署向团队演示新功能。一位开发者点击链接,打开开发者工具,滚动 Network 标签。就在那里:你的 Stripe API 密钥、数据库密码、AWS 凭证——全部嵌在响应头或构建日志里。任何拥有这个 URL 的人现在都可以访问你的生产 API。一小时内,有人可能在运行测试交易、窃取用户数据或消耗你的云配额。

你从不打算泄露这些。它们不在你的代码里。但它们就是在那里。

环境变量如何泄露到预览部署中

Vercel 的预览部署是个超级武器:每个 PR 都立即获得一个实时 URL,使代码审查直观且即时。但它们也有代价。如果你使用环境变量存储 API 密钥、数据库 URL、第三方令牌,这些变量会在构建过程中嵌入输出,除非你明确阻止。

原理是这样的:

为什么它隐形到太晚才发现

最阴险的部分:你不会注意到,直到有人这样做。你专注于功能更改,而不是哪些变量通过了。DevTools 界面不会尖叫”你的 API 密钥在这里”。错误日志看起来很正常。网站加载、工作并看起来没问题。

与此同时: - 你团队中的一个好奇的开发者右键点击”检查”。 - 来自第三方库的贡献者测试预览。 - 有人从你的 GitHub 抓取 PR URL 并检查它们是否暴露了密钥。这种事情持续发生在网络上。

当你意识到发生了什么时,伤害可能已经造成。

实际风险是什么

如果攻击者获得你的预览环境变量,伤害是立即的:

这些都不需要复杂的攻击。一个 curl 命令和 grep 就足够了。

修复:三层防御

第一层:永远不要提交密钥。 这是基础。使用 .env.local 并添加到 .gitignore。Git 历史是永久的——如果你曾经提交过密钥,立即轮换并假定泄露。

第二层:使用 Vercel 的环境变量 UI。 与其通过 GitHub 或构建脚本传递密钥,不如在 Vercel 的项目设置中直接添加:

Vercel 自动按环境隔离这些。

第三层:清理到达客户端的内容。 如果变量必须可被浏览器代码访问,使用公开前缀:

NEXT_PUBLIC_API_URL=https://api.example.com  // 安全暴露
STRIPE_SECRET_KEY=sk_live_abc123            // 永不暴露

Vercel 和其他构建工具自动从客户端构建中剥离未前缀的密钥。严格使用这个约定。

证明:立即审计你的预览

如果你有一个预览 URL 在运行,测试它:

  1. 在浏览器中打开预览链接。
  2. 打开 DevTools(F12 → Network 标签)。
  3. 重新加载页面并查看 API 请求。
  4. 检查头部,特别是 Authorization、自定义头部和 cookies。
  5. 检查 HTML 源代码(Ctrl+U)中的内联 window.config 或类似脚本。

如果你看到 API 密钥、数据库 URL 或令牌,立即修复。这不是理论问题。

为什么这在规模上很重要

当你构建 SaaS 软件时——无论是为你的业务构建自定义工具还是为客户构建产品——这个安全盲点至关重要。专业的软件开发工作流在架构审查阶段捕获这些问题,在代码部署前。安全不是一项功能;它是一个检查点。这是防止昂贵漏洞和保护用户数据的严谨性。

如果你在管理自定义软件或想要有人检查你的安全态势,Trove Deck Solution 可以审计你从构建到生产的整个管道。如果你想走过你的设置并堵住漏洞,请随时联系我们。

#SaaS#IndieHackers#Security#Vercel#APISecurity#DevOps#SecurityMistakes#WebSecurity