Vibe session · Learning mode阅读、尝试、提问都留在同一个工作区
Course Map
练习进度 0/55
Learning Guide
Build session

安全与认证 — AI 生成的代码怎么不掉坑

intermediate · 15-20 min · 步骤 1/4

上个月我在一个开源项目里看到了 AI 生成代码留下的 API Key——它就躺在源代码里

这不是个别现象。GitHub 上有专门的工具(比如 TruffleHog、GitGuardian)扫描仓库里泄露的密钥。自从 AI 编程工具火了之后,密钥泄露的数量明显增多了——因为 AI 在生成示例代码的时候,经常会写出看起来很真实的 API Key,而开发者没注意就直接提交了。

但硬编码密钥只是 AI 安全问题的冰山一角。我把 AI 生成代码里最常见的安全问题分成了五大类:

安全为什么重要Vibe Coding 安全总览——AI 生成代码的安全风险全景图

第一类:硬编码秘密(Hardcoded Secrets)

这是最低级但最常见的问题。AI 在生成代码时经常这样写:

// ❌ AI 经常生成的写法
const JWT_SECRET = 'my-super-secret-key-12345';
const DATABASE_URL = 'postgresql://admin:password123@localhost:5432/mydb';
const STRIPE_KEY = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc';

有时候 AI 生成的 key 看起来特别像真的(比如那个 Stripe Key 的格式完全正确),你可能会以为"这只是个占位符"——但如果你的项目里正好有一个 .env 文件里的真实 key,AI 有可能直接把它读出来放到代码里。

正确的做法是所有秘密都走环境变量:

// ✅ 正确写法
const JWT_SECRET = process.env.JWT_SECRET;
if (!JWT_SECRET) throw new Error('JWT_SECRET is not defined');

第二类:缺少输入校验(Missing Input Validation)

你跟 AI 说"写一个搜索接口",它可能生成这样的代码:

// ❌ AI 经常忘记校验
app.get('/api/search', async (req, res) => {
  const { keyword } = req.query;
  const results = await db.query(`SELECT * FROM products WHERE name LIKE '%${keyword}%'`);
  res.json(results);
});

这段代码有两个问题:第一,keyword 没有任何校验——如果传入一个 5000 字符的字符串?或者传入 null?第二,更严重的是 SQL 注入——用户可以在 keyword 里塞入恶意 SQL 代码,直接操作你的数据库。

说实话,如果你用了 Prisma 或 Mongoose 这样的 ORM,SQL 注入的风险会低很多,因为 ORM 自带参数化查询。但 AI 有时候会绕过 ORM 写原生 SQL,尤其是在做复杂查询的时候。

不要告诉 AI 的敏感信息Agent 安全边界架构图——AI Agent 的权限边界和访问控制模型

第三类:权限检查缺失(Missing Authorization)

这个问题比前两个更隐蔽,因为代码能正常运行,功能测试也全部通过——但任何登录用户都能操作别人的数据。

// ❌ 典型的权限漏洞
app.delete('/api/posts/:id', authMiddleware, async (req, res) => {
  // 检查了登录,但没检查"这是不是你的文章"
  await db.post.delete({ where: { id: req.params.id } });
  res.json({ success: true });
});

// ✅ 正确的写法
app.delete('/api/posts/:id', authMiddleware, async (req, res) => {
  const post = await db.post.findUnique({ where: { id: req.params.id } });
  if (!post) return res.status(404).json({ error: 'Not found' });
  if (post.authorId !== req.user.id) return res.status(403).json({ error: 'Forbidden' });
  await db.post.delete({ where: { id: req.params.id } });
  res.json({ success: true });
});

AI 经常会加上 authMiddleware(认证),但忘了加业务层面的授权检查。这两个概念要分清楚:认证(Authentication)是确认"你是谁",授权(Authorization)是确认"你能不能做这件事"

第四类:敏感数据泄露(Data Exposure)

AI 生成的 API 响应经常把整个数据库对象直接返回:

// ❌ 直接返回数据库对象
const user = await db.user.findUnique({ where: { id: userId } });
res.json(user); // 包含 passwordHash、internalNotes、isAdmin 等敏感字段

你的前端可能只需要 name 和 avatar,但 AI 图省事把所有字段都返回了。如果有人用浏览器的开发者工具看一眼 API 响应,就能看到不该看的信息。

代码安全风险沙箱隔离安全模式——通过沙箱机制限制 AI Agent 的操作范围

第五类:没有速率限制(No Rate Limiting)

AI 几乎从来不会主动给接口加速率限制。但对于登录、注册、密码重置这类接口,不加限制意味着攻击者可以无限次尝试暴力破解密码。

这五类问题有一个共同点:AI 不是不知道这些安全措施,而是你没要求的时候它不会主动加。 它生成的代码优先保证"功能正确"而不是"安全正确"。这就是为什么后端代码必须经过人工安全审查。

Vibe Workspace
Live build context

AI 写的代码能跑,但你敢上线吗?

认识 AI 生成代码中最高频的安全隐患,知道什么地方必须人工检查

自动保存在此设备
识别 AI 生成代码中最常见的 5 类安全问题理解认证(Authentication)和授权(Authorization)的区别以及 AI 容易忽略的点掌握一份实用的 Security Review 清单
Home| Vibe Lab
草稿自动保存