2.4 KiB
2.4 KiB
维度(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)
- 关键链路回归:管理员登录/模型配置/知识搜索/排行榜/分享奖励 全部通过