Skip to content

代码审查流程:/code-review 与安全审计 ​

学完你能做什么 ​

代码审查是确保代码质量和安全的关键环节。本教程帮你:

  • ✅ 使用 /code-review 命令自动检查代码变更
  • ✅ 理解 code-reviewer agent 和 security-reviewer agent 的区别
  • ✅ 掌握安全检查清单(OWASP Top 10)
  • ✅ 检测和修复常见安全漏洞(SQL 注入、XSS、硬编码密钥等)
  • ✅ 应用代码质量标准(函数大小、文件长度、测试覆盖率等)
  • ✅ 理解审批标准(CRITICAL、HIGH、MEDIUM、LOW)

你现在的困境 ​

你写好了代码,准备提交,但:

  • ❌ 不知道代码里有没有安全漏洞
  • ❌ 担心遗漏了代码质量问题
  • ❌ 不确定是否遵循了最佳实践
  • ❌ 手动检查费时费力,容易遗漏
  • ❌ 希望在提交前自动发现问题

Everything Claude Code 的代码审查流程解决这些问题:

  • 自动化检查:/code-review 命令自动分析所有变更
  • 专业化审查:code-reviewer agent 专注代码质量,security-reviewer agent 专注安全
  • 标准分级:问题按严重程度分类(CRITICAL、HIGH、MEDIUM、LOW)
  • 详细建议:每个问题都包含具体修复建议

什么时候用这一招 ​

每次提交代码前都应该运行代码审查:

  • ✅ 新增功能代码完成后
  • ✅ 修复 bug 后
  • ✅ 重构代码后
  • ✅ 添加 API 端点时(必须运行 security-reviewer)
  • ✅ 处理用户输入的代码(必须运行 security-reviewer)
  • ✅ 涉及认证/授权的代码(必须运行 security-reviewer)

最佳实践

养成习惯:每次 git commit 前,先运行 /code-review。如果有 CRITICAL 或 HIGH 问题,修复后再提交。

🎒 开始前的准备 ​

你需要的:

  • 已安装 Everything Claude Code(如果还没安装,查看快速开始)
  • 有一些代码变更(可以先用 /tdd 写一些代码)
  • 对 Git 基本操作有了解

你不需要的:

  • 不需要是安全专家(agent 会帮你检测)
  • 不需要记住所有安全最佳实践(agent 会提醒你)

核心思路 ​

Everything Claude Code 提供两个专业的审查 agent:

code-reviewer agent ​

专注代码质量和最佳实践,检查:

  • 代码质量:函数大小(>50 行)、文件长度(>800 行)、嵌套深度(>4 层)
  • 错误处理:缺失 try/catch、console.log 语句
  • 代码规范:命名规范、重复代码、不可变模式
  • 最佳实践:Emoji 使用、TODO/FIXME 缺少 ticket、JSDoc 缺失
  • 测试覆盖:新代码缺少测试

使用场景:所有代码变更都应该经过 code-reviewer。

security-reviewer agent ​

专注安全漏洞和威胁,检查:

  • OWASP Top 10:SQL 注入、XSS、CSRF、认证绕过等
  • 密钥泄露:硬编码 API keys、密码、tokens
  • 输入验证:缺失或不当的用户输入验证
  • 认证授权:不当的身份验证和权限检查
  • 依赖安全:过时的或有已知漏洞的依赖包

使用场景:涉及安全敏感的代码(API、认证、支付、用户输入)必须经过 security-reviewer。

问题严重程度分级 ​

级别含义是否阻止提交示例
CRITICAL严重安全漏洞或重大质量问题❌ 必须阻止硬编码 API key、SQL 注入
HIGH重要安全问题或代码质量问题❌ 必须阻止缺少错误处理、XSS 漏洞
MEDIUM中等优先级问题⚠️ 可以小心提交Emoji 使用、缺少 JSDoc
LOW轻微问题✓ 可以后续修复格式不一致、魔法数字

跟我做:第一次代码审查 ​

第 1 步:创建一些代码变更 ​

先用 /tdd 写一个简单的 API 端点(包含一些安全隐患):

bash
/tdd

让 Claude Code 创建一个用户登录 API,代码大概这样:

typescript
// src/api/login.ts
export async function loginUser(email: string, password: string) {
  const query = `SELECT * FROM users WHERE email = '${email}'`  // ❌ SQL 注入风险
  const user = await db.query(query)
  
  if (user.password === password) {  // ❌ 明文密码比较
    const token = generateToken(user.id)
    console.log('User logged in:', { email, password })  // ❌ 日志泄露密码
    return { token }
  }
}

为什么 这段代码包含多个安全隐患和代码质量问题,适合用来演示代码审查功能。

你应该看到:代码文件已创建。


第 2 步:运行代码审查 ​

现在运行 /code-review 命令:

bash
/code-review

为什么/code-review 会自动调用 code-reviewer agent 检查所有未提交的变更。

你应该看到:agent 开始分析代码,然后输出审查报告。


第 3 步:查看审查报告 ​

code-reviewer 会输出类似这样的报告:

markdown
# Code Review Report

## Critical Issues (Fix Immediately)

### 1. [CRITICAL] Hardcoded credentials
**File:** src/api/login.ts:3
**Issue:** Password logging in console
**Fix:** Remove password from logs, only log user ID

```typescript
// ❌ Bad
console.log('User logged in:', { email, password })

// ✓ Good
console.log('User logged in:', { email, userId: user.id })

2. [CRITICAL] SQL injection vulnerability ​

File: src/api/login.ts:2 Issue: String concatenation in SQL query Fix: Use parameterized queries

typescript
// ❌ Bad
const query = `SELECT * FROM users WHERE email = '${email}'`

// ✓ Good
const { data } = await supabase
  .from('users')
  .select('*')
  .eq('email', email)

High Issues (Fix Before Production) ​

3. [HIGH] Plaintext password comparison ​

File: src/api/login.ts:4 Issue: Password stored in plaintext Fix: Use bcrypt to hash passwords

typescript
// ❌ Bad
if (user.password === password) {

// ✓ Good
import bcrypt from 'bcrypt'
const isValid = await bcrypt.compare(password, user.password)

Recommendations ​

  1. Add input validation for email format
  2. Add rate limiting to prevent brute force attacks
  3. Use JWT tokens instead of generating custom tokens

Approval Status ​

❌ BLOCKED - 2 CRITICAL issues found

Please fix all CRITICAL and HIGH issues before committing.


**为什么**
报告按严重程度分类,每个问题都包含位置、描述、修复建议和代码示例。

**你应该看到**:清晰的审查报告,指出所有问题和修复建议。

---

### 第 4 步:修复问题

根据报告修复代码:

```typescript
// src/api/login.ts
import bcrypt from 'bcrypt'
import { z } from 'zod'

const LoginSchema = z.object({
  email: z.string().email(),
  password: z.string().min(8)
})

export async function loginUser(input: unknown) {
  // 输入验证
  const validated = LoginSchema.parse(input)
  
  // 参数化查询(防止 SQL 注入)
  const { data: user } = await supabase
    .from('users')
    .select('*')
    .eq('email', validated.email)
    .single()
  
  if (!user) {
    throw new Error('Invalid credentials')
  }
  
  // 哈希密码比较
  const isValid = await bcrypt.compare(validated.password, user.password_hash)
  
  if (isValid) {
    const token = generateToken(user.id)
    console.log('User logged in:', { email: validated.email, userId: user.id })
    return { token }
  }
  
  throw new Error('Invalid credentials')
}

为什么 修复所有 CRITICAL 和 HIGH 问题,添加输入验证和哈希密码比较。

你应该看到:代码已更新,消除了安全隐患。


第 5 步:再次审查 ​

再次运行 /code-review:

bash
/code-review

为什么 验证所有问题已修复,确保代码可以提交。

你应该看到:类似这样的通过报告:

markdown
# Code Review Report

## Summary

- **Critical Issues:** 0 ✓
- **High Issues:** 0 ✓
- **Medium Issues:** 1 ⚠️
- **Low Issues:** 1 💡

## Medium Issues (Fix When Possible)

### 1. [MEDIUM] Missing JSDoc for public API
**File:** src/api/login.ts:9
**Issue:** loginUser function missing documentation
**Fix:** Add JSDoc comments

```typescript
/**
 * Authenticates a user with email and password
 * @param input - Login credentials (email, password)
 * @returns Object with JWT token
 * @throws Error if credentials invalid
 */
export async function loginUser(input: unknown) {

Low Issues (Consider Fixing) ​

2. [LOW] Add rate limiting ​

File: src/api/login.ts:9 Issue: Login endpoint lacks rate limiting Fix: Add express-rate-limit middleware

typescript
import rateLimit from 'express-rate-limit'

const loginLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 5 // 5 attempts per window
})

app.post('/api/login', loginLimiter, loginUser)

Approval Status ​

✅ APPROVED - No CRITICAL or HIGH issues

Note: Medium and Low issues can be fixed in follow-up commits.


**你应该看到**:审查通过,代码可以提交。

---

### 第 6 步:安全专项审查(可选)

如果你的代码涉及 API 端点、认证、支付等安全敏感功能,可以专门调用 security-reviewer:

```bash
/security-reviewer

为什么 security-reviewer 会进行更深入的 OWASP Top 10 分析,检查更多安全漏洞模式。

你应该看到:详细的安全审查报告,包括 OWASP 分析、依赖漏洞检查、安全工具推荐等。


检查点 ✅ ​

完成上述步骤后,你应该:

  • ✅ 能够运行 /code-review 命令
  • ✅ 理解审查报告的结构和内容
  • ✅ 能够根据报告修复代码问题
  • ✅ 知道 CRITICAL 和 HIGH 问题必须修复
  • ✅ 理解 code-reviewer 和 security-reviewer 的区别
  • ✅ 养成提交前先审查的习惯

踩坑提醒 ​

常见错误 1:跳过代码审查 ​

问题:觉得代码简单,直接提交,不运行审查。

后果:可能遗漏安全漏洞,被 CI/CD 拒绝或造成生产事故。

正确做法:养成习惯,每次提交前运行 /code-review。


常见错误 2:忽略 MEDIUM 问题 ​

问题:看到 MEDIUM 问题就不管了,积累下来。

后果:代码质量下降,技术债累积,后续难以维护。

正确做法:虽然 MEDIUM 问题不阻止提交,但应该在合理时间内修复。


常见错误 3:手动修复 SQL 注入 ​

问题:自己写字符串转义,而不是使用参数化查询。

后果:转义不完整,仍然有 SQL 注入风险。

正确做法:始终使用 ORM 或参数化查询,不要手动拼接 SQL。


常见错误 4:混淆两个 reviewer ​

问题:所有代码都只运行 code-reviewer,忽略 security-reviewer。

后果:安全漏洞可能被遗漏,特别是涉及 API、认证、支付的代码。

正确做法:

  • 普通代码:code-reviewer 足够
  • 安全敏感代码:必须同时运行 security-reviewer

本课小结 ​

代码审查流程是 Everything Claude Code 的核心功能之一:

功能agent检查内容严重程度
代码质量审查code-reviewer函数大小、错误处理、最佳实践HIGH/MEDIUM/LOW
安全审查security-reviewerOWASP Top 10、密钥泄露、注入漏洞CRITICAL/HIGH/MEDIUM

关键要点:

  1. 每次提交前运行 /code-review
  2. CRITICAL/HIGH 问题必须修复才能提交
  3. 安全敏感代码必须经过 security-reviewer
  4. 审查报告包含详细位置和修复建议
  5. 养成习惯:审查 → 修复 → 再次审查 → 提交

下一课预告 ​

下一课我们学习 Hooks 自动化。

你会学到:

  • Hooks 是什么,如何自动化开发流程
  • 15+ 个自动化钩子的使用方法
  • 如何自定义 Hooks 适应项目需求
  • SessionStart、SessionEnd、PreToolUse 等钩子的应用场景

附录:源码参考 ​

点击展开查看源码位置

更新时间:2026-01-25

功能文件路径行号
---------
---------
---------
---------

关键常量:

  • 函数大小限制:50 行(code-reviewer.md:47)
  • 文件大小限制:800 行(code-reviewer.md:48)
  • 嵌套深度限制:4 层(code-reviewer.md:49)

关键函数:

  • /code-review:调用 code-reviewer agent 进行代码质量审查
  • /security-reviewer:调用 security-reviewer agent 进行安全审计
  • git diff --name-only HEAD:获取未提交的变更文件(code-review.md:5)

审批标准(code-reviewer.md:90-92):

  • ✅ Approve: No CRITICAL or HIGH issues
  • ⚠️ Warning: MEDIUM issues only (can merge with caution)
  • ❌ Block: CRITICAL or HIGH issues found