Skip to content

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 双重鉴权。
  • 文件写入限定目录。
  • 错误处理不会破坏已有数据。
  • 已记录剩余风险。

来源