AI 写代码越快,安全问题也可能来得越快
AI 编程最吸引人的地方是快。
一句话能生成接口。几分钟能搭出页面。一小时能做出原型。一天能完成过去几天的开发量。
但安全测试必须提醒大家:
生成速度不是安全质量。
AI 可以很快写出能运行的代码,也可以很快写出:
没有鉴权的接口。
存在 SQL 注入的查询。
缺少 CSRF 防护的表单。
硬编码密钥。
不安全文件上传。
过度信任前端参数。
没有租户隔离的查询。
依赖漏洞和许可证风险。
这就是 AI 生成代码安全测试的重要性。
Vibe Coding 可以加速探索,但不能免除代码审查、安全扫描和回归验证。
AI 生成代码为什么容易有安全风险
1. 模型会学习常见写法,也会学习不安全写法
大模型从大量代码中学习模式。但公开代码里并不全是安全最佳实践。
它可能生成看起来熟悉、能运行、但并不安全的代码。
例如:
SELECT * FROM users WHERE name = '${name}'这种代码很容易被 SQL 注入攻击。
2. Agent 可能为了完成任务忽略安全边界
如果任务描述是:
快速实现一个文件上传功能。
Agent 可能只关注上传成功,而忽略:
文件类型校验。
文件大小限制。
病毒扫描。
路径穿越。
权限校验。
临时文件清理。
外链访问控制。
3. 测试集可能没有覆盖安全场景
现有测试通常更关注功能正确:
是否能上传。
是否能下载。
是否能保存。
但不一定覆盖:
上传可执行文件。
伪造 MIME 类型。
超大文件。
路径穿越。
未授权下载。
AI 如果只看现有测试,可能会“学会让测试通过”,但不一定学会安全。
4. Agent 可能引入新依赖
为了解决问题,Agent 可能自动安装包。
风险包括:
依赖有已知漏洞。
依赖无人维护。
依赖许可证不兼容。
依赖名字相似,可能是 typosquatting。
依赖带来过多传递依赖。
新依赖不是小事,尤其在企业和金融场景。
AI 生成代码的常见安全风险
1. 鉴权和授权缺失
最常见也最危险。
AI 可能生成:
只有登录校验,没有角色校验。
前端隐藏按钮,但后端接口不校验。
只校验用户 ID 存在,不校验资源归属。
管理员接口缺少权限判断。
多租户系统缺少 tenant_id 过滤。
测试样本:
普通用户访问管理员接口。
A 用户访问 B 用户资源。
A 租户访问 B 租户数据。
已注销账号访问历史接口。
修改请求参数绕过前端限制。
判断标准:
权限必须在后端和数据层校验,不能只靠前端或自然语言约定。
2. 注入漏洞
包括:
SQL 注入。
NoSQL 注入。
命令注入。
模板注入。
XPath 注入。
LDAP 注入。
Prompt Injection。
AI 生成代码时,如果直接拼接用户输入,就可能引入注入风险。
测试方法:
SAST。
参数化查询检查。
恶意输入样本。
模糊测试。
代码 Review。
3. XSS 和输出编码
前端和模板代码常见风险:
直接渲染用户输入。
使用危险 HTML 注入 API。
Markdown 渲染未净化。
富文本编辑器过滤不足。
错误地信任 AI 生成内容。
AI 应用还要特别注意:
模型输出可能包含 HTML。
RAG 文档可能包含恶意脚本。
Agent 生成报告可能被嵌入页面。
测试要覆盖存储型、反射型和 DOM 型 XSS。
4. 敏感信息泄露
AI 可能生成:
过度详细错误信息。
打印 Token 的日志。
返回完整用户对象。
把密钥写入配置。
把客户数据写入测试快照。
在 PR 说明里粘贴敏感日志。
测试点:
日志脱敏。
错误信息脱敏。
API 返回字段最小化。
测试数据脱敏。
密钥扫描。
5. 不安全文件处理
常见问题:
文件名未净化。
路径穿越。
任意文件读取。
任意文件覆盖。
上传可执行文件。
大文件导致资源耗尽。
临时文件未清理。
Agent 生成文件处理代码时,必须强制安全 Review。
6. 依赖和供应链风险
AI 可能建议安装一个看起来方便的包。
测试要检查:
包来源。
维护状态。
下载量和社区信誉。
已知 CVE。
许可证。
传递依赖。
是否有更轻量的已有内部方案。
不能让 Agent 随意扩展供应链。
7. 许可证和版权风险
AI 生成代码可能受到训练数据影响,或者建议复制开源片段。
企业要关注:
是否引入不兼容许可证。
是否复制大段第三方代码。
是否保留必要版权声明。
是否符合公司开源政策。
这属于合规风险,不只是技术问题。
AI 生成代码安全测试流程
第一步:任务风险分级
不是所有 AI 生成代码都同样危险。
高风险任务包括:
鉴权授权。
支付。
退款。
账户。
文件上传。
数据导出。
加密。
网络请求。
生产配置。
CI/CD。
日志和审计。
这些任务必须进入更严格门禁。
第二步:限制 Agent 权限
Agent 不应默认拥有无限权限。
建议限制:
不允许自动合并。
不允许直接发布。
不允许修改密钥。
不允许修改生产配置。
不允许删除测试。
不允许随意新增依赖。
不允许绕过安全扫描。
Agent 可以提出建议,但高风险动作必须经过人工审批。
第三步:安全静态扫描
AI 生成代码必须跑 SAST。
扫描内容包括:
注入。
XSS。
不安全加密。
路径穿越。
硬编码密钥。
不安全反序列化。
SSRF。
日志泄露。
静态扫描不能发现所有问题,但它是基础门禁。
第四步:依赖扫描
新增依赖必须扫描:
已知漏洞。
许可证。
维护状态。
供应链风险。
如果 Agent 新增依赖,应在 PR 说明中解释:
为什么需要。
为什么不用现有依赖。
安全风险如何评估。
第五步:安全测试样本
针对高风险功能补充测试样本。
例如权限逻辑:
未登录。
普通用户。
管理员。
跨租户。
资源不存在。
资源属于别人。
文件上传:
空文件。
超大文件。
错误类型。
伪造 MIME。
路径穿越文件名。
重复文件名。
第六步:人工安全 Review
安全 Review 要重点看:
信任边界。
输入校验。
输出编码。
权限校验。
错误处理。
日志脱敏。
依赖来源。
关键业务规则。
不要只看代码风格。
一个案例:AI 生成导出接口
任务:
给后台管理系统新增一个导出客户列表的接口。
Agent 可能生成:
GET /customers/export。
查询 customers 表。
生成 CSV。
返回下载链接。
看起来功能完成了,但安全测试要问:
谁可以导出?
是否只能导出授权范围?
是否支持字段脱敏?
是否限制导出数量?
是否记录审计日志?
是否防止频繁导出?
CSV 是否防止公式注入?
下载链接是否过期?
文件是否加密或受控访问?
是否包含手机号、身份证、邮箱等敏感字段?
如果这些都没有,功能完成不等于可以上线。
AI 生成代码安全指标
| 指标 | 说明 |
|---|---|
| 高危漏洞新增数 | AI 生成代码引入的高危安全问题 |
| 权限缺陷率 | 鉴权、授权、租户隔离错误比例 |
| 敏感信息泄露率 | 日志、接口、测试数据中的泄露问题 |
| 不安全依赖新增数 | 新增依赖中的漏洞或许可证问题 |
| 安全测试覆盖率 | 高风险功能是否有安全样本 |
| 安全扫描通过率 | SAST、依赖扫描、密钥扫描结果 |
| 人工安全 Review 返工率 | 安全评审后需要重写的比例 |
| 生产安全回归数 | AI 代码上线后引发的安全缺陷 |
AI 生成代码安全清单
任务是否涉及高风险领域?
Agent 是否修改鉴权、授权、支付、文件、网络或 CI/CD?
是否新增依赖?
是否跑 SAST?
是否跑依赖扫描?
是否跑密钥扫描?
是否补充权限和边界测试?
是否检查日志和错误信息脱敏?
是否检查输入校验和输出编码?
是否检查多租户隔离?
是否禁止 Agent 删除或放宽安全测试?
是否有人工安全 Review?
是否记录 Agent 修改 trace?
是否把发现的问题加入安全回归集?
总结
AI 生成代码不是天然安全,也不是天然危险。真正的问题在于:如果没有安全门禁,AI 会把不安全代码生成得更快、传播得更快、合并得更快。
可以用一句话总结:
Vibe Coding 可以加速原型,但生产代码必须经过权限、输入、输出、依赖、密钥、测试和人工 Review 的安全验证。
夜雨聆风