上个月我在一个开源项目里看到了 AI 生成代码留下的 API Key——它就躺在源代码里
这不是个别现象。GitHub 上有专门的工具(比如 TruffleHog、GitGuardian)扫描仓库里泄露的密钥。自从 AI 编程工具火了之后,密钥泄露的数量明显增多了——因为 AI 在生成示例代码的时候,经常会写出看起来很真实的 API Key,而开发者没注意就直接提交了。
但硬编码密钥只是 AI 安全问题的冰山一角。我把 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,尤其是在做复杂查询的时候。


第三类:权限检查缺失(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 响应,就能看到不该看的信息。


第五类:没有速率限制(No Rate Limiting)
AI 几乎从来不会主动给接口加速率限制。但对于登录、注册、密码重置这类接口,不加限制意味着攻击者可以无限次尝试暴力破解密码。
这五类问题有一个共同点:AI 不是不知道这些安全措施,而是你没要求的时候它不会主动加。 它生成的代码优先保证"功能正确"而不是"安全正确"。这就是为什么后端代码必须经过人工安全审查。
AI 写的代码能跑,但你敢上线吗?
认识 AI 生成代码中最高频的安全隐患,知道什么地方必须人工检查