PR: api/auth.ts — 新增 login() 函数
文件: api/auth.ts · 语言: TypeScript + Next.js · 新增 5 行
0
整体评分 0 / 5 — 阻塞
安全问题 3 个 P0
测试覆盖 0%
审查人 DeepSeek TUI
日期 2026-05-15
决策: BLOCK — 明文密码比较 + 未处理 null + 无测试覆盖,不可合入任何分支。
3
P0 阻塞项
3
P1 高危项
2
P2 建议项
0
维度通过 (≥4)
📋 8 维 Review Checklist
维度 评分 关键发现
1. 功能正确性 0 P0 用户不存在时 usernull,访问 .password 抛出 TypeError,返回 500 而非 401。
P0 明文密码直接比较,暗示数据库中没有 hash 存储。
P2 无输入验证 — 空 email、空 password、非法 email 格式均未拦截。
2. 测试覆盖 0 P0 无任何测试文件。未覆盖:合法登录、错误密码、不存在用户、空输入、JWT payload 正确性。
P1 无集成测试验证 JWT 可被 API handler 正常解密。
3. 安全 0 P0 明文密码比较 — 不符合 OWASP A2:2021。必须使用 bcrypt.compare()
P1 无速率限制 — 可暴力破解。
P1 错误信息泄露 — 用户存在 vs 不存在会产生不同的时序/堆栈行为,可枚举已注册用户。
P2 JWT 无 expiresIn — 永不过期,凭证泄漏后无撤销窗口。
4. 性能 3 单次 findFirst 查询,无 N+1 风险。但未指定 select 字段 — 数据库返回整行,密码字段通过网络传输到应用层处理。建议用 select: { id: true, password: true } 只取必要字段。
5. 可读性 3 代码短,逻辑直观。但 req 参数无 TypeScript 类型 — 缺少 NextApiRequest 类型标注。函数名 login 可以更精确(如 loginHandlerhandleLogin)。
6. 可维护性 2 JWT secret 硬编码或依赖隐式全局 — 建议注入配置。
鉴权逻辑直接耦合在路由 handler 中 — 应抽取 authService 层以便复用和测试。
7. 工程规范 1 无 TypeScript 类型注解。
无 JSDoc 或注释说明入参/出参/错误码。
未提供 .env.example 中 JWT secret 的环境变量声明。
8. 风险评估 0 P0 Blast radius: 全平台 — 明文密码一旦泄漏,所有用户密码暴露。
P1 回滚成本极高 — 上线后需强制所有用户重置密码。
无灰度策略 — 无 feature flag 封装。
🔧 具体修改建议
⚠️ 风险评估
Blast Radius
全平台
数据泄漏风险
明文密码 — 数据库拖库即全员沦陷
OWASP 映射
A2:2021 · A7:2021
回滚成本
极高 — 需强制全量密码重置
合规影响
GDPR · PIPL · SOC2 · PCI-DSS 均不通过
建议灰度
Feature flag: ENABLE_PASSWORD_LOGIN → 先 0% 上线观察
最终决策
决策: BLOCK — 存在 3 个 P0 阻塞项,必须先修复再重新提交审查。
⛔ Block Approve · Approve with Comments · Request Changes · Block ✓
💬 评审意见草稿(可粘贴到 PR comment)

⛔ Block — 不可合入

感谢提交。这份登录逻辑存在几个严重的安全和功能问题,需要在重新审查前修复。 P0 — 阻塞项 1. 明文密码比较 (api/auth.ts:4):user.password === req.body.password 表明密码以明文存储和比较。这是不可接受的。请使用 bcrypt.compare() 进行安全比较,并确保注册时使用 bcrypt.hash() 存储。若现有数据为明文密码,需设计迁移方案。 2. 用户不存在时崩溃 (api/auth.ts:3):db.user.findFirst 无匹配返回 null,下一行访问 user.password 会抛出 TypeError,API 返回 500 而非 401。请先判空。 3. 零测试覆盖:需补充至少 6 个测试 case:合法登录、错误密码、不存在用户、空输入、非法 email、速率限制触发。建议使用 vitest + mock dbP1 — 高危项 4. JWT 无过期时间 (api/auth.ts:4):jwt.sign 缺少 expiresIn,建议 7d access token + 30d refresh token。 5. 无速率限制:请对 /api/auth 添加 rate-limit(建议 5 次/分钟/IP)。 6. 错误信息泄露:用户不存在和密码错误应返回统一的 401 Invalid credentials,防止用户枚举攻击。 P2 — 建议项 7. TypeScript 类型req 参数应标注为 NextApiRequest,响应应标注 NextApiResponse。 8. 输入验证:建议用 zod 校验 email 格式和 password 最小长度。 9. 字段裁剪findFirst 建议加 select: { id: true, passwordHash: true },避免不必要字段传输。 请修复后再提交 review。有任何问题随时讨论。
Code Review by DeepSeek TUI · 2026-05-15 · 8-dim Google CR framework
本页面由 办一下|banyixia.com AI 生成