AI 生成代码的安全审查清单
AI 能快速生成大量代码,但也可能复用过时模式、遗漏边界校验、弱化权限判断,或者在日志和示例中泄露敏感信息。任何准备进入生产环境的 AI 生成代码,都应该经过安全审查。
使用方式
每次涉及登录、权限、文件、外部请求、数据库、支付、后台管理、部署脚本时,把本页当作合并前检查表。
text
请按 docs/production/security-checklist.md 审查当前 diff。
优先找安全风险、权限绕过、敏感信息泄露、输入校验缺失和部署配置问题。1. 身份认证与权限
| 检查项 | 通过标准 |
|---|---|
| 登录状态在服务端或可信边界验证 | 不只依赖前端隐藏按钮 |
| 管理接口有独立鉴权 | /admin、/api/admin 等接口必须校验管理员身份 |
| 用户只能访问自己的资源 | 防止水平越权 |
| 角色权限集中定义 | 不在多个页面散落硬编码判断 |
| 权限失败返回明确状态码 | 401 未登录,403 无权限 |
示例:
typescript
if (!session.user) {
return Response.json({ message: 'Unauthorized' }, { status: 401 })
}
if (session.user.role !== 'admin') {
return Response.json({ message: 'Forbidden' }, { status: 403 })
}2. 输入校验
| 检查项 | 通过标准 |
|---|---|
| API 入参有 schema 校验 | 使用 Zod、Valibot、Joi 或框架内置校验 |
| 数字范围受限 | page、limit、amount、quantity 不允许无限大 |
| 字符串长度受限 | title、description、comment 有最大长度 |
| 枚举值白名单 | status、role、type 不接受任意字符串 |
| 文件名和路径安全 | 不允许 ../ 路径穿越 |
示例:
typescript
import { z } from 'zod'
const CreateTaskSchema = z.object({
title: z.string().min(1).max(120),
owner: z.string().min(1).max(60),
status: z.enum(['todo', 'in_progress', 'blocked', 'done']),
priority: z.enum(['low', 'medium', 'high']),
})3. 注入风险
| 风险 | 禁止做法 | 推荐做法 |
|---|---|---|
| SQL 注入 | 拼接 SQL 字符串 | 参数化查询或 ORM |
| 命令注入 | exec(userInput) | execFile + 参数白名单 |
| XSS | 直接渲染 HTML | 转义输出,限制富文本 |
| SSRF | 任意 fetch 用户 URL | 域名白名单 |
| 路径穿越 | 用用户输入拼文件路径 | normalize 后检查根目录 |
SQL 示例:
typescript
// 不要这样
const sql = `select * from tasks where owner = '${owner}'`
// 推荐
const rows = await db.task.findMany({ where: { owner } })4. 敏感信息
| 检查项 | 通过标准 |
|---|---|
没有提交 .env 和密钥 | .gitignore 覆盖本地密钥文件 |
| 日志不打印 token、cookie、password | 日志只保留必要字段 |
| 示例配置使用占位符 | YOUR_API_KEY,不使用真实值 |
| 错误信息不暴露堆栈给用户 | 生产环境返回通用错误 |
| CI/CD secret 使用平台密钥管理 | 不写入仓库 |
搜索命令:
bash
rg -n "(password|secret|api[_-]?key|token|private_key|BEGIN RSA)" .5. 文件上传与下载
| 检查项 | 通过标准 |
|---|---|
| 限制文件大小 | 防止资源耗尽 |
| 限制文件类型 | MIME 和扩展名都检查 |
| 文件名重新生成 | 不信任用户原始文件名 |
| 上传目录不可执行 | 防止脚本执行 |
| 下载接口校验权限 | 不能猜 URL 下载别人的文件 |
6. 依赖与供应链
| 检查项 | 通过标准 |
|---|---|
| 新依赖有明确理由 | 不为小功能引入大包 |
| lockfile 一起提交 | 构建可复现 |
| 运行依赖审计 | npm audit 或同类工具 |
| 不使用无人维护包 | 检查维护状态和许可证 |
| CI 使用固定版本 | 避免隐式升级 |
7. 后台管理功能
后台管理是高风险区域,至少检查:
- 管理页面需要登录。
- 管理 API 也需要登录,不能只保护页面。
- 修改、删除、导入、导出操作需要权限。
- 保存文件时限制在允许目录内。
- JSON 写入前做 schema 校验。
- 写入失败要保留原文件,不生成半截数据。
- 操作日志不记录密码或 token。
8. 部署前检查
| 检查项 | 通过标准 |
|---|---|
| 生产环境关闭 debug | 不暴露源码路径和堆栈 |
| HTTPS 强制启用 | Cookie 设置 Secure |
CORS 不使用 * 配合凭据 | 明确允许域名 |
| 安全响应头配置 | CSP、X-Frame-Options、Referrer-Policy |
| 静态目录不暴露源文件 | 不上传 .env、源码压缩包、备份文件 |
给 Claude Code / Codex 的审查提示
text
请按安全审查模式检查当前改动。
先列高风险问题,再列中低风险。
重点检查鉴权、输入校验、路径写入、敏感信息、依赖和部署配置。
不要只总结改了什么。最小上线门槛
- 构建通过。
- 测试通过或明确说明测试缺口。
- 没有真实密钥。
- 管理功能有页面和 API 双重鉴权。
- 文件写入限定目录。
- 错误处理不会破坏已有数据。
- 已记录剩余风险。