Skip to content

Code Review 辅助

问题描述

团队提交了一个 500 行的 Pull Request,涉及用户认证流程的修改。需要仔细 Review 确保没有安全问题和逻辑错误。

传统 Review 很耗时,而且容易遗漏问题。

传统思路

  1. 逐行阅读 - 耗时,容易疲劳后遗漏
  2. 凭经验看重点 - 可能错过不熟悉领域的问题
  3. 只看改动部分 - 忽略上下文影响
  4. 口头讨论 - 效率低,没有记录

预计耗时:30-60分钟,质量不稳定

AI思维

第一步:整体分析

请帮我 Review 这个 PR,涉及用户认证流程的修改。

## 改动概述
修改了登录验证逻辑,添加了多因素认证支持。

## 代码变更
[粘贴 diff 或关键代码]

请从以下角度分析:
1. 安全性问题
2. 逻辑正确性
3. 边界情况处理
4. 性能影响
5. 代码质量

第二步:AI 给出 Review 意见

AI 的 Review 报告:

安全性问题 🔴

  1. 密码明文日志 (严重)
java
// 第 45 行
log.info("Login attempt: user={}, password={}", username, password);

建议:移除密码参数,或使用脱敏处理。

  1. 时序攻击风险 (中等)
java
// 第 78 行
if (storedPassword.equals(inputPassword)) {

使用 equals 比较密码存在时序攻击风险。 建议使用:MessageDigest.isEqual()BCrypt.checkpw()

  1. 缺少登录频率限制 (中等) 没有看到对失败登录次数的限制,可能被暴力破解。

逻辑正确性问题 🟡

  1. MFA 绕过风险
java
// 第 102 行
if (user.isMfaEnabled() && mfaCode != null) {
    verifyMfaCode(user, mfaCode);
}

如果 mfaCode 为 null,MFA 校验会被跳过。 建议改为:

java
if (user.isMfaEnabled()) {
    if (mfaCode == null) {
        throw new MfaRequiredException();
    }
    verifyMfaCode(user, mfaCode);
}
  1. 异常处理不一致 第 89 行抛出 RuntimeException,其他地方抛出 AuthException

边界情况 🟡

  1. 用户名为 null 或空字符串时没有校验
  2. 并发登录同一账号时的处理不明确

性能问题 🟢

  1. 第 156 行每次登录都查询权限表,建议缓存
java
List<Permission> perms = permissionRepo.findByUserId(user.getId());

代码质量 🟢

  1. 方法 authenticate 有 80 行,建议拆分
  2. 魔法数字:第 134 行的 300 应该提取为常量
  3. 缺少关键方法的 Javadoc

第三步:针对性深入

关于你提到的时序攻击风险,请详细解释:
1. 什么是时序攻击
2. 为什么 equals 有问题
3. 如何正确修复

AI 详细解释:

时序攻击(Timing Attack)

原理

java
// String.equals 的实现
public boolean equals(Object anObject) {
    // ...
    while (n-- != 0) {
        if (v1[i] != v2[i])
            return false;  // 发现不同立即返回
        i++;
    }
    return true;
}

如果第一个字符不同,立即返回(快) 如果前面都相同最后一个不同,遍历完才返回(慢)

攻击方式

  1. 尝试密码 "a******" - 如果很快返回,说明第一位不是 a
  2. 尝试密码 "b******" - 如果稍慢,说明第一位可能是 b
  3. 逐位推断出密码

正确实现

java
// 使用常量时间比较
import java.security.MessageDigest;

public boolean verifyPassword(String input, String stored) {
    byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);
    byte[] storedBytes = stored.getBytes(StandardCharsets.UTF_8);
    return MessageDigest.isEqual(inputBytes, storedBytes);
}

// 或者使用 BCrypt(推荐)
public boolean verifyPassword(String rawPassword, String encodedPassword) {
    return BCrypt.checkpw(rawPassword, encodedPassword);
}

MessageDigest.isEqual 无论在哪个位置不匹配,都会比较完所有字节,耗时恒定。

第四步:生成 Review 总结

请生成一个正式的 Code Review 总结,包括:
1. 必须修复的问题
2. 建议改进的问题
3. 总体评价

AI 生成正式总结:

Code Review 总结

PR: #1234 - 用户认证流程优化 Reviewer: AI Assisted Review 日期: 2025-12-xx


🔴 必须修复 (Blocking)

#问题位置严重性
1密码明文日志L45Critical
2MFA 绕过漏洞L102Critical
3时序攻击风险L78High

🟡 建议修复 (Non-blocking)

#问题位置类型
4缺少登录频率限制-Security
5输入参数校验L23Robustness
6异常类型不一致L89Consistency
7权限查询无缓存L156Performance

🟢 代码质量建议

  • 拆分过长的 authenticate 方法
  • 提取魔法数字为常量
  • 补充关键方法的文档

总体评价

功能实现思路正确,但存在严重的安全问题需要修复后才能合并。建议:

  1. 先修复 Blocking 问题
  2. 添加单元测试覆盖安全场景
  3. 考虑请安全团队再次 Review

建议: Request Changes

结果对比

指标传统方式AI思维
时间30-60分钟10-15分钟
覆盖面依赖经验系统全面
安全问题发现可能遗漏专项检查
文档化口头或简单评论结构化报告

关键洞察

  1. 多角度审查:安全、逻辑、性能、质量同时检查
  2. 深入追问:对不理解的问题让 AI 详细解释
  3. 标准化输出:生成正式的 Review 报告
  4. 学习机会:通过 AI 的解释学习新的安全知识

Code Review Prompt 模板

请帮我 Review 以下代码变更。

## 背景
[这个 PR 要解决什么问题]

## 代码
[粘贴代码或 diff]

请从以下角度分析:
1. 安全性问题(认证、授权、注入、敏感信息等)
2. 逻辑正确性
3. 边界情况和异常处理
4. 性能影响
5. 代码质量和可维护性

请按严重程度分类,给出具体位置和修复建议。

Released under the MIT License.