[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$feeqp76nFdMbHircoxi9zn5XlLDoEE1HOnYFcIEALEeA":3},{"item":4,"related":51},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":39,"sourceName":40,"sourceUrl":41,"status":42,"seoTitle":43,"seoDescription":44,"canonicalUrl":45,"isFeatured":46,"sno":47,"sortOrder":48,"publishedAt":49,"updatedAt":50,"createdAt":50},"7418caa8-c69e-4dd7-bf51-795caea4a39d","article","Vibe Coding 时，为什么最容易泄露 API Key 和密码","vibe-coding-api-key-secret-leak","AI 编程最容易把秘密藏进前端、日志、配置和聊天上下文。本文解释浏览器端密钥、环境变量、日志暴露和 Agent 权限的风险，并给出适合个人项目的最小安全检查清单。","Vibe Coding 里最危险的时刻，往往不是模型生成了一段明显错误的代码，而是它顺手把一个秘密写进了“临时方案”：API Key 放在前端常量里，数据库密码出现在示例配置中，或者调试日志把完整的访问令牌打印了出来。页面能跑起来的那一刻，也可能意味着凭据已经进入浏览器、仓库和构建产物。\n\n## 为什么新手特别容易泄露秘密\n\n第一，前端代码天然会发给用户。只要密钥出现在浏览器加载的 JavaScript、HTML 或网络请求里，用户就能通过开发者工具看到它。环境变量名称以 `PUBLIC` 或 `NEXT_PUBLIC` 开头，也通常意味着它会被打包到客户端，不能存放真正的秘密。\n\n第二，AI 喜欢让示例“马上可运行”。当接口需要密钥时，模型可能建议把值直接填进配置文件，或者让开发者把 `.env` 复制进仓库。对演示来说很方便，对真实服务来说却是长期暴露。\n\n第三，日志和错误信息常被忽视。一个失败请求可能把 `Authorization` 头、完整 URL 查询参数或第三方响应写进日志，而日志往往比源码有更多访问者、保留更久。\n\n## 先分清什么是配置，什么是秘密\n\nAPI 地址、超时时间和公开的项目标识可以是配置；私钥、数据库密码、签名密钥、OAuth 刷新令牌和生产服务令牌属于秘密。配置可以进入版本控制，秘密应该由运行环境注入，并限制读取它的服务和人员。\n\n一个安全的基本结构是：浏览器调用你自己的后端，后端在服务器侧读取密钥，再调用第三方服务。这样密钥不会出现在客户端。后端还需要校验用户身份、限制请求频率、记录必要的审计信息，并为第三方响应设置超时。\n\n## 给 AI 的任务应该带上安全边界\n\n不要只说“接入某某 API”，可以明确写成：\n\n> 密钥只能从服务器环境变量读取，不得写入源码、返回给浏览器或出现在日志；先生成接口设计和错误处理，再实现；所有外部请求设置超时，并说明本地测试需要怎样注入假凭据。\n\n这类约束能减少模型走捷径的机会。完成后还要搜索仓库和构建产物，检查常见关键词、配置文件和调试输出。不要把完整的真实密钥粘贴到聊天上下文里，必要时使用已失效的占位值。\n\n## 已经泄露了怎么办\n\n第一步不是删除文件，而是立即撤销或轮换凭据。因为 Git 历史、构建缓存、日志和聊天记录可能仍然留有副本。第二步确认访问范围和使用记录，判断是否有异常调用。第三步清理仓库历史、补充扫描和保护规则，再重新发布使用新凭据的版本。\n\nGitHub 的安全实践建议配合密钥扫描、分支保护和最小权限；如果 AI Agent 需要执行命令或访问网络，也应只给完成任务所需的权限。能写文件、能安装依赖、能读取环境变量的 Agent，其能力边界必须被当成生产安全边界对待。\n\n## 一份适合个人项目的检查清单\n\n- 浏览器端没有服务端密钥。\n- `.env` 等本地秘密文件没有提交到仓库。\n- 日志不会输出令牌、密码和完整认证头。\n- 生产凭据可以轮换，服务只拥有最小权限。\n- 提交前和 CI 中都有秘密扫描。\n- 任何“全权限运行”的 AI 操作都在隔离环境中进行。\n\nAI 编程能把接入服务的时间压缩到几分钟，但秘密管理不能被压缩成一句“先跑起来”。把安全要求写进任务描述、代码检查和发布门槛，才是真正适合长期使用的 Vibe Coding。\n\n## 来源\n\n- [GitHub Copilot CLI：工具权限控制](https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Fhow-tos\u002Fcopilot-cli\u002Fuse-copilot-cli\u002Fallowing-tools)\n- [GitHub：使用 GHAS 保护 AI 编程 Agent](https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcode-security\u002Fhow-tos\u002Fuse-ghas-with-ai-coding-agents)","\u002Fuploads\u002F2026-09-13\u002F794d5f6a-d25b-4e2c-a002-cd743a31acff.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31,35],{"id":24,"name":25,"slug":26},"0848beb4-db26-4fb8-b391-f852a11be192","AI编程","ai-coding",{"id":28,"name":29,"slug":30},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":32,"name":33,"slug":34},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":36,"name":37,"slug":38},"68cedb55-2cac-412f-8f81-fda8c7d686dd","思考","thought","GitHub 安全官方文档","GitHub：使用 GHAS 保护 AI 编程 Agent","https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcode-security\u002Fhow-tos\u002Fuse-ghas-with-ai-coding-agents","published","Vibe Coding 如何避免泄露 API Key 和密码","从前端打包、环境变量、日志和终端 Agent 权限出发，解释 AI 编程中的秘密泄露风险与最小安全防线。",null,false,47,0,"2026-09-13T00:00:00.000Z","2026-09-13T11:55:51.460Z",[52,61,69],{"id":53,"type":6,"title":54,"slug":55,"summary":56,"coverUrl":57,"authorName":14,"sno":58,"publishedAt":59,"createdAt":60},"18be9090-3d46-4fc4-8010-1448ef76c9cb","可复现构建：同一份源代码应该得到同一份软件","reproducible-builds-ai-coding","可复现构建要求相同源码和构建条件产生逐字节一致的产物，帮助 AI 生成的软件实现验证、审计与问题追踪。","\u002Fuploads\u002F2026-09-14\u002F6bb235b2-b055-42c9-9283-e18668483892.jpg",55,"2026-09-14T00:00:00.000Z","2026-09-14T15:01:39.101Z",{"id":62,"type":6,"title":63,"slug":64,"summary":65,"coverUrl":66,"authorName":14,"sno":67,"publishedAt":49,"createdAt":68},"190a2a0d-4b47-40f7-902a-00ac69ce1b15","AI 编程时代，为什么 Git 和 Pull Request 更重要了","ai-coding-git-pull-request-safety-net","AI 让改动出现得更快，也让变化更难凭记忆追踪。本文解释小提交、Pull Request、自动检查和人工批准如何把 AI 编程变成可比较、可验证、可回滚的协作流程。","\u002Fuploads\u002F2026-09-13\u002F95ac3b51-0915-4200-8130-4ba3195fd935.jpg",40,"2026-09-13T11:56:01.900Z",{"id":70,"type":6,"title":71,"slug":72,"summary":73,"coverUrl":74,"authorName":14,"sno":67,"publishedAt":49,"createdAt":75},"7cc644a5-e0de-4d7b-802e-9e8b69677e12","AI 生成的代码会不会复制开源项目","ai-code-open-source-reference-license","AI 生成代码不等于天然没有来源。本文区分常见写法与高相似片段，解释代码引用、许可证、依赖供应链和轻量来源检查，帮助团队把合规当成代码质量的一部分。","\u002Fuploads\u002F2026-09-13\u002F920327ad-de7f-4caa-a2f4-816d467c9f9c.jpg","2026-09-13T11:55:49.911Z"]