跳到主内容
@wquguru
精选88人人都是产品经理(RSS)独立开发与小生意

Vibe Coding API Key 泄露复盘:8条低成本启动安全规范

Vibe Coding 半年,我用 80 块钱买了个教训

原文
发到 X
推荐理由

独立开发者做 Vibe Coding 极易踩坑,这 8 条是花 80 块钱买来的实操清单,今天就能照着改代码和配置。

一把 3 月创建的 DeepSeek Key 从 8 月 23 日起每天被调用,因为自己也在内测、又赶上 DeepSeek 涨价,直到一个月后才发现:共消耗 ¥80.58、1,752 次请求、1.07 亿 token。这篇文章,我们来看看作者的复盘经历。

前段时间,我正在开发的一个产品做了邀请测试。上周五,邀测入口关闭;周日,邀测群解散。

然后 9 月 22 日,我出差回来第二天,下午准备开始做优化迭代的后续开发,随手刷了一下 DeepSeek 的后台,发现用量不太对——按道理邀测结束了,不该有消耗了,但是为啥早上还用掉了 7 块钱?

一、案发:一把 3 月的 Key,8 月起天天被调用

于是,赶紧核对,发现有一把 Key 不对劲。

这把 Key 是 3 月 16 日创建的。3 月、4 月、5 月有零星的调用,这些我有印象,因为我当时把这把 Key 用在了好些地方:又是监控任务,又是视频转文字,又是写作工具的。

但是 6 月,我已经把服务器关停注销了。按道理,这把 Key 早就应该偃旗息鼓才是。

结果,我发现从 8 月 23 日开始,它每天都在被调用,一天都没断过。而那段时间,我根本没有在用它。而且这盗用 Key 的孙子也很精明:一开始每天就几毛钱,发现我没发现,胆子就大起来了。

巧合的是,他用量高的时候,我也差不多进了内测;等到邀测开放了,更多的人在体验产品,加上 DeepSeek 涨价——所以我是真的没发现,居然这个 Key 是被泄露了。

先说一下损失吧:8 月 23 日到 9 月 22 日,一共消耗了 80 块人民币。这特么是 DeepSeek!

8/23–9/22 的消耗账单:¥80.58,1,752 次请求,1.07 亿 tokens

二、排查:22 个文件,7 种藏法

发现了问题,我第一反应是去 Railway 翻仓库,看是哪个项目的变量配了这把 key——一开始我还窃喜:不会是我哪个产品爆了吧?幸福来得有点突然啊。

后来……我可 QNMD 吧!

翻了一圈,没有。

最后的办法很笨:把本机所有项目目录全盘扫一遍,按 Key 的字符串去搜。

结果是找到了 22 个文件。我把它们分了一下类,你看看有没有眼熟的:

  • 代码里的 fallback:写的是process.env.DEEPSEEK_API_Key || ‘sk-a559a…’:环境变量没配,就用写死的真 Key 顶上。源码里有一份,编译出来的产物里又有一份。
  • 各种 .env 文件:开发的、生产的、服务端的,每个项目各一份。
  • .env.example:这个文件本来是给别人看格式用的样例,里面放的却是真 Key。
  • 部署脚本和 docker-compose:一个脚本里,有 3 处明文。
  • 测试文件:测试桩里写死的,也是真 Key。
  • 文档:修复报告、部署总结、测试计划、手动部署指南,一共 7 份,全都把 Key 原样贴了进去。
  • AI 工具的项目记忆:它把 Key 当成「需要记住的信息」记下来了。

还有一个仓库,连 .gitignore 都没有;另一个仓库的 .gitignore 只忽略了 .env,漏掉了 .env.production。

三、归因:它没错,我也没错——问题在这

然后我开始回想:怎么会泄露的呢?

说实话,天知地知我不知道。毕竟,当时部署用的那台服务器早就到期注销了。

后来想明白了,想起来又怎样?一把 Key 躺在 22 个地方,其中任何一个外流,都够我吃一壶的。

真正的问题是:它为什么会出现在 22 个地方?

我冷静下来,开始拼图:

3 月份我刚开始接触 vibe coding,那时候我的注意力全在一件事上:能不能跑起来?

AI 也一样。你让它把服务跑通,它最省事的做法,就是在代码里给 Key 写一个 fallback,保证不报错;你让它写部署文档,它就把能跑通的完整命令抄进去,Key 也跟着进去了;你让它写测试报告,它会把「用的是哪把 Key」当成一个有用的信息写上。

它每一步都没做错,都是在认真完成我交代的任务。

问题是:没人告诉它「这个东西不能到处放」——连我自己当时也没这个意识。毕竟我是个做运营的,刚接触开发,卫生习惯差,也不能说就是「十恶不赦」。

说白了,这就是开发过程中的卫生问题,和什么事故之类的没有半毛钱关系。但代价是,我本来可以用 80 块钱买肯德基全家桶吃的,现在呢?

呸!

四、止损:8 条,都是真金白银换的

我相信和我一样没有开发基础的朋友,vibe coding 的过程中大概率会犯同样的错。所以我把这段经历回顾下来,并给出几条算不上什么专家的小建议,希望 vibe coding 的你也用得上:

一个项目一把 Key:

  • 不要舍不得写完整的名字,比如写成「项目名-环境-云服务商」。出了问题,看名字就知道去哪找。
  • API Key 只放在环境变量里,代码里不留 fallback:少了无所谓,报错呗。报错好,能报错,比悄悄用上一把真 Key、然后被别人拿去薅要好 1000 倍。
  • 新建仓库,第一件事是写 .gitignore:所有 .env* 都要忽略,不只是 .env。
  • .env.example 里只放占位符
  • 不把 Key 贴进任何对话框:AI 会记住,会写进它的笔记和文档里,而你不知道它最后会藏在哪儿。
  • 设消费限额:被盗用的时候,限额就是止损线。
  • 项目或服务器下线时,顺手作废它用过的 Key:这次就是服务器没了,Key 还活着。
  • 发现异常,先把 Key 撤销掉——我这次就是先排查没撤销:上午烧了 7 块,下午排查继续烧了 2 块。

这 8 条,是我用真金白银的损失换回来的。希望你能看得上、记住它们。

那这 80 块钱被薅得,还算有价值。

本文由人人都是产品经理作者【张亮-leo】,微信公众号:【张记杂货铺】,原创/授权 发布于人人都是产品经理,未经许可,禁止转载

题图来自Unsplash,基于 CC0 协议

更进一步:量化金融体系

看懂新闻只是起点——沿量化金融路径,把它变成能交付的工程能力

进入量化体系 →

相似阅读

关联信息,但可能不是同一事件