上周Review同事用AI生成的代码,发现了一个硬编码的API Key直接写在前端代码里。问他知不知道这个问题,他说"AI生成的我就直接用了,没仔细看"。
这件事让我挺后怕的。我们团队用AI写代码的比例已经超过60%了,但对AI生成代码的安全审查几乎为零。估计很多团队都是这个状态。
今天专门聊聊AI生成代码的安全隐患,希望能引起大家的重视。
AI生成代码的常见安全风险
1. SQL注入
这是最经典的安全漏洞,但AI生成的代码里依然经常出现。尤其是当你让AI写数据库查询的时候,如果你的Prompt里没有明确要求使用参数化查询,AI很可能会生成字符串拼接SQL的代码。
我测试过好几个AI模型,如果你只说"写一个用户登录功能",大概有30-40%的概率生成的代码会有SQL注入风险。但如果你在Prompt里加上"使用参数化查询,防止SQL注入",这个概率就降到了5%以下。
所以问题不完全在AI,而在于使用者有没有安全意识。
2. XSS跨站脚本攻击
AI生成前端代码的时候,经常忘记对用户输入做转义处理。特别是在React之外的框架里(React默认会做一些转义),原生HTML或者Vue模板里,AI经常直接用v-html或者innerHTML来渲染用户输入。
我在一个真实项目里就遇到过这个问题。AI帮我写了一个评论展示组件,直接用v-html渲染评论内容。如果有人在评论里插入恶意脚本,所有看到这条评论的用户都会中招。
3. 硬编码密钥和凭据
这是我见过最多的问题。AI在生成示例代码的时候,经常会用看起来像真实的密钥做占位符,比如sk-xxxxx这种格式。开发者如果不注意,直接把这段代码提交了,或者更糟糕的情况——把自己的真实密钥通过Prompt喂给了AI,然后AI在生成的代码里直接硬编码了。
更隐蔽的是,有些AI生成的配置文件会把数据库密码、Redis密码等直接写在配置里,而不是引用环境变量。如果你没有仔细检查就把这些文件提交到Git仓库,那就是把钥匙挂在了大门上。
4. 不安全的依赖
AI推荐的第三方包可能存在已知漏洞。AI的训练数据有截止日期,它推荐的某个包的版本可能在训练之后被发现有安全漏洞。
我就遇到过AI推荐了一个已经被弃用的npm包,这个包有一个已知的原型链污染漏洞。如果我不检查直接用了,项目就埋了一个安全隐患。
5. 不安全的认证和授权
AI生成的认证代码经常有问题:token过期时间设太长、密码哈希用了弱算法、权限检查不完整、CORS配置过于宽松等。
这些问题不像SQL注入那么容易被发现,但危害一点不小。
如何防范这些风险
方法一:AI Code Review
既然代码是AI写的,那也可以用AI来做安全审查。很多AI编程工具已经支持自动Code Review功能了。
我的做法是在提交代码之前,专门跑一轮AI安全审查。用一个专门的Security Review Prompt,让AI检查代码中的安全隐患。这种方法能发现大部分常见的安全问题。
当然AI Review也不是万能的,它可能会遗漏一些上下文相关的安全问题。所以关键模块的代码还是需要人工Review。
方法二:安全Skill配置
如果你用的AI工具支持Skills功能,强烈建议配置一个安全相关的Skill。在Skill里定义好安全编码规范:必须使用参数化查询、禁止硬编码密钥、必须对用户输入做转义、密码必须使用bcrypt或argon2等。
这样AI在生成代码的时候就会自动遵守这些安全规范,从源头上减少安全隐患。
方法三:OWASP检查清单
OWASP Top 10是Web安全领域最权威的漏洞清单。建议把OWASP Top 10作为代码审查的标准清单,每次AI生成的代码都对照检查一遍。
不需要你自己记住所有的检查项,可以让AI根据OWASP Top 10来审查代码。关键是要形成这个习惯。
方法四:依赖审计
AI推荐的第三方包,用之前先查一下有没有已知漏洞。npm audit、snyk、GitHub Dependabot这些工具都可以帮你做依赖审计。
建议在CI/CD流水线里加入依赖安全扫描,每次构建的时候自动检查。这样即使AI推荐了有问题的依赖,也能在上线之前被拦住。
一个真实案例
分享一个我经历的真实案例。去年底我们用AI生成了一个文件上传功能。代码看起来没问题,功能也正常。但有一天安全团队在渗透测试中发现,这个上传接口没有做文件类型校验和大小限制。
攻击者可以上传任意类型的文件,包括可执行文件。如果再结合其他漏洞,理论上可以实现远程代码执行。
问题出在哪?AI生成代码的时候实现了核心的上传功能,但忽略了安全校验。而开发者因为"AI写的应该没问题"的心态,没有做安全Review就上线了。
这次事件让我们团队建立了一个规则:所有AI生成的代码,涉及用户输入、文件处理、认证授权、数据库操作的部分,必须经过安全Review才能合并。
写在最后
AI写代码的效率确实高,但安全不能因为效率而打折扣。我的核心观点是:用AI写代码没问题,但要建立起安全审查的机制和习惯。
把安全要求写进AI的Prompt或Skill里,让AI在生成代码的时候就考虑安全;AI生成的代码上线前做安全Review,关键模块人工检查。
做到这两点,就能在享受AI高效的同时,不至于给项目埋雷。
你在AI生成的代码里发现过安全问题吗?你的团队有什么安全审查机制?欢迎在评论区分享你的经验和做法。