Files
ai-dimension/docs/代码评审报告-2026-09-19.md
T

29 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 维度(ai-dimension)代码评审与修复报告 · 2026-09-19
## 已修复(生产验证通过)
| 级别 | 问题 | 修复 | 验证 |
|---|---|---|---|
| P0 | /api/auth/webview-token 仅凭 openid 签发任意用户 token(排行榜公开 openid = 账号接管) | 接口下线(客户端无调用) | 返回"接口不存在" ✓ |
| P0 | POST /progress 可写 isSubscriber/isAdFree/subscribeExpiry/ownedSkins 白嫖付费权益 | 客户端写入全部剔除 | 写入后 DB 保持 false ✓ |
| P1 | aiModel 接口向管理员以外泄露 apiKey 明文 | 列表/详情/默认配置全部脱敏 | 密钥数=0 ✓ |
| P1 | 登录 identifier/verifyCode 未强转(对象注入 $ne) | 入口 String() 强转 | 代码审计 ✓ |
| P1 | sessionKey(支付签名凭据)随 /me、progress 全量下发 | schema select:false,仅 vpay 中间件显式查询 | 代码审计 ✓ |
| P2 | 搜索 $regex 未转义(ReDoS/注入) | escapeRegExp 全量接入(knowledge+admin 9处) | 正则字符搜索 200 ✓ |
| P2 | 排行榜 limit 无上限且返回 openid | limit 封顶100、去 openid | 无 openid ✓ |
| P2 | share-gain 无限刷问答次数 | 每日限3次(shareRecords 统计) | 第4次 429 ✓ |
| P2 | 读接口每次写 AdminLog(日志膨胀) | GET 路由移除 logAction(11处) | 代码审计 ✓ |
| P2 | /:dim/questions 泄露检测题 isCorrect | 选项脱敏(该接口当前无数据,防御性修复) | 代码审计 ✓ |
| P3 | /shop-items 与 /shop 完全重复 | 删除 /shop-items | 代码审计 ✓ |
## 已知残留(评估后接受/待定)
- **旧 payment.js 体系**(weixin.js 恒真验签、mock 退款、H5 mock 下单):属未启用的旧订阅支付链路,vpay(虚拟支付)才是现行通道;建议下个迭代整体删除旧 payment/weixin 文件避免误用。
- **充值回调非原子幂等**(check-then-act):已有 orderNo 流水查重兜底,重推双倍入账概率极低;建议加 {orderNo,type} 唯一索引彻底封死。
- **退款先冻结后调微信非事务**:进程崩溃窗口极小且有人工对账兜底(管理后台流水),接受。
- **访问埋点全量写**:目前 PV 低无压力;流量上来后改采样。
## 验证环境
- 生产:wdkj.yuzhiran.com.cn(dim-server v1.6.21 healthy)
- 关键链路回归:管理员登录/模型配置/知识搜索/排行榜/分享奖励 全部通过