安全
依赖与密钥审查。
安全
这一课你将能做到
- 用「AI 生成代码安全审查清单」逐项检查注入、密钥泄露、依赖幻觉三大风险
- 配置自动化安全扫描工具(SAST、依赖检查)进 CI,形成兜底
- 建立团队级的 AI 使用安全规范,防止敏感信息泄露给 AI
为什么要学
AI 生成代码的安全风险不是「AI 故意害你」,而是「AI 不知道什么是安全的」。它训练数据里有大量不安全的代码示例( Stack Overflow 上的快糙猛答案、教程里的简化示例),它会不加区分地复现这些模式。
人话:AI 是个博览群书但没有安全意识的实习生。它知道一百种实现「拼接 SQL」的方法,但不知道哪一种会注入;它记得无数教程里的硬编码密钥示例,但不知道密钥不能进代码。
真实项目中,AI 代码的安全审查必须显性化、清单化、自动化——不能靠「我觉得这段代码没问题」,要靠「清单逐项过了没有」。
先建立图像
AI 生成代码的三大安全风险:
┌─────────────────────────────────────────┐
│ 1. 注入风险 │
│ SQL 注入、XSS、命令注入、路径遍历 │
│ AI 复现训练数据里的不安全模式 │
├─────────────────────────────────────────┤
│ 2. 密钥泄露 │
│ 硬编码密码、API key、内部域名 │
│ AI 从训练数据里学来的「示例习惯」 │
├─────────────────────────────────────────┤
│ 3. 依赖幻觉 │
│ 编造不存在的包名、推荐恶意包 │
│ AI 的「幻觉」+ 供应链攻击的温床 │
└─────────────────────────────────────────┘
跟着做
步骤 1:建立「AI 代码安全审查清单」
每次 AI 生成代码后,按清单逐项检查:
## AI 生成代码安全审查清单
### 注入风险
- [ ] SQL:是否用了参数化查询?(检查所有 SQL 拼接)
- [ ] XSS:用户输入是否转义后才渲染?(检查前端模板)
- [ ] 命令注入:是否用了 Runtime.exec 或 ProcessBuilder?参数是否过滤?
- [ ] 路径遍历:文件路径是否做了规范化?(检查 ../ 处理)
- [ ] LDAP/XML/XXE:相关解析是否禁用外部实体?
### 密钥与敏感信息
- [ ] 代码里有没有硬编码的密码、API key、token?
- [ ] 配置文件的示例值是不是真实凭证?
- [ ] 日志里会不会打印敏感信息(密码、身份证号、token)?
- [ ] 错误信息会不会泄露内部结构(表名、字段名、堆栈)?
### 依赖与供应链
- [ ] 新引入的依赖是否真实存在?(去 Maven Central / npmjs 验证)
- [ ] 依赖版本是否是最新稳定版?(检查是否有已知漏洞)
- [ ] 依赖的许可证是否合规?(GPL 传染性检查)
### 其他
- [ ] 权限校验:每个接口是否检查了调用者权限?
- [ ] 数据校验:所有外部输入是否做了校验(类型、长度、格式、范围)?
- [ ] 加密:敏感数据是否加密存储?(密码用 BCrypt,不用 MD5/SHA1)
步骤 2:逐项检查一个真实案例
让 AI 生成一个「用户登录接口」,然后按清单审查:
// AI 生成的代码(有安全问题)
@PostMapping("/login")
public Result<String> login(String username, String password) {
// 问题 1:SQL 注入
String sql = "SELECT * FROM user WHERE username = '" + username +
"' AND password = '" + password + "'";
User user = jdbcTemplate.queryForObject(sql, User.class);
// 问题 2:密码明文比较
if (user != null && user.getPassword().equals(password)) {
// 问题 3:token 硬编码密钥
String token = JWT.create()
.withSubject(username)
.sign(Algorithm.HMAC256("secret123")); // 硬编码密钥
return Result.success(token);
}
return Result.error("登录失败");
}