非技术背景做Vibe Coding,我踩过的最大坑是API Key泄露
一把 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 协议

起点课堂会员权益





认可‘AI只是完成指令’这个判断,但反过来想,现在主流的AI coding工具基本都有敏感信息拦截提醒,作者全程没触发过一次,要么是用的工具太早期,要么是当时光盯着跑通结果,连工具的警告都忽略了。说‘自己没意识’没问题,但做运营出身对线上服务的安全基线其实是有感知的,只是vibe coding的时候把‘先跑通’的优先级放得太高,把安全习惯直接丢了。