
在开发一款产品的过程中,我遇到了API Key泄露的问题。从3月份开始,一把Key每天被调用,直到8月23日被发现存在异常消耗。经过排查,发现该Key存在于多个文件和项目中,包括代码、环境变量、部署脚本等。通过反思,我意识到这是由于缺乏对项目卫生习惯的重视,导致Key被滥用。为了避免类似问题,我提出了8条建议:一个项目一把Key,只放在环境变量里,新建仓库时写.gitignore,不把Key贴进对话框,设消费限额,项目或服务器下线时作废Key。这次事件虽然让我损失了80元,但通过止损,我学到了很多宝贵的经验教训。
--91likeyou---
一、案发:一把 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 块钱被薅得,还算有价值。
题图来自Unsplash,基于 CC0 协议
🔥 热词:#基于Vibe Coding开发幼教工具的可行性分析 · #vibe coding和codex的区别 · #AI Vibe Coding codebuddy算吗 · #vibe coding 工具 比较排名 · #vibe coding项目 · #Vibe Coding产品方案设计 · #vibe coding能申请软件著作权么 · #vibe coding工具有哪些