108 lines
4.8 KiB
Markdown
108 lines
4.8 KiB
Markdown
# Council Plan — vr-shopxo-plugin 代码审议
|
||
|
||
> Round 3 — 2026-04-15
|
||
> 状态:**Finalize Phase**
|
||
|
||
---
|
||
|
||
## Task Summary
|
||
|
||
对 vr-shopxo-plugin ShopXO 票务插件进行**全栈代码审议**(评论性质,不改代码,变更提交本地 worktree)。
|
||
|
||
---
|
||
|
||
## 审议范围
|
||
|
||
1. 插件架构(EventListener.php / plugin.json)
|
||
2. 票务核心(TicketService.php / BaseService.php)
|
||
3. 前端票务详情页(ticket_detail.html)
|
||
4. 数据库 Schema(001_vr_tables.sql)
|
||
5. 安全性审计(注入/XSS/重放/QR伪造)
|
||
|
||
---
|
||
|
||
## 问题发现汇总(三方交叉验证)
|
||
|
||
| 编号 | 严重程度 | 类别 | 描述 | 来源 |
|
||
|------|---------|------|------|------|
|
||
| S-01 | 🔴 严重 | 业务逻辑 | `onOrderPaid` 无幂等保护,同一订单可生成多张票 | SE/BA/FE |
|
||
| S-02 | 🔴 严重 | 安全 | 购票参数前端计算无服务端验签,价格可被篡改 | BA/FE |
|
||
| S-03 | 🔴 严重 | 安全 | `$goods.content\|raw` 存储型 XSS | SE/BA/FE |
|
||
| S-04 | 🔴 严重 | 密钥管理 | QR 加密密钥回退到硬编码默认值 | SE/BA |
|
||
| M-01 | 🟡 中等 | 业务逻辑 | `verifyTicket` TOCTOU 竞态条件 | SE/BA |
|
||
| M-02 | 🟡 中等 | 鉴权 | 手动核销接口未验证核销员身份 | SE |
|
||
| M-03 | 🟡 中等 | 数据安全 | 观演人身份证明文存储 | SE |
|
||
| M-04 | 🟡 中等 | 功能 | `loadSoldSeats` 未实现,存在超卖风险 | SE/BA/FE |
|
||
| M-05 | 🟡 中等 | 体验 | CSS 缺少响应式设计,移动端体验差 | FE |
|
||
| M-06 | 🟡 中等 | 前端 | 座位图渲染缺乏边界情况处理 | FE |
|
||
| M-07 | 🟡 中等 | 安全 | JSON输出使用 `|raw` | FE |
|
||
| L-01 | 🟢 轻微 | 前端 | `data-label` 属性可能含未转义数据 | SE |
|
||
| L-02 | 🟢 轻微 | 加密 | AES-CBC 无认证加密(无 HMAC) | SE/BA |
|
||
| L-03 | 🟢 轻微 | 体验 | 已选座位 UI 缺少状态管理 | FE |
|
||
| L-04 | 🟢 轻微 | 安全 | 观演人表单无前端格式校验 | FE |
|
||
| L-05 | 🟢 轻微 | 隐私 | 座位映射数据暴露在前端 JS | FE |
|
||
| I-01 | 💡 建议 | 架构 | Enable/Disable 钩子缺失 | BA |
|
||
| I-02 | 💡 建议 | 架构 | 升级迁移逻辑为空 | SE/BA |
|
||
| I-03 | 💡 建议 | 业务 | 退款钩子已注册但未实现 | SE |
|
||
| I-04 | 💡 建议 | 体验 | 座位数量无硬上限 | FE |
|
||
| I-05 | 💡 建议 | 扩展 | 座位图字符集仅支持 ASCII | FE |
|
||
| I-06 | 💡 建议 | 性能 | `spec_base_id` 缺少独立索引 | FE |
|
||
| I-07 | 💡 建议 | 安全 | 座位图 JSON 无长度限制 | FE |
|
||
| I-08 | 💡 建议 | 兼容性 | ALTER TABLE 兼容性判断错误(`empty($cols)` 无效) | BA |
|
||
|
||
**来源说明**:SE=SecurityEngineer / BA=BackendArchitect / FE=FrontendDev
|
||
|
||
---
|
||
|
||
## 立即修复优先级
|
||
|
||
### P0 - 立即处理(上线前必须)
|
||
1. **S-01** — `onOrderPaid` 添加幂等检查
|
||
2. **S-02** — 购票参数改为服务端验价
|
||
3. **S-03** — 移除 `|raw` XSS(simple_desc + content)
|
||
4. **S-04** — 移除 QR 密钥硬编码回退
|
||
|
||
### P1 - 高优先级
|
||
5. **M-02** — 手动核销接口鉴权
|
||
6. **M-01** — `verifyTicket` 使用乐观锁原子更新
|
||
7. **M-04** — 实现 `loadSoldSeats()` 后端 API
|
||
|
||
### P2 - 中优先级
|
||
8. **M-05** — 增加 CSS 媒体查询
|
||
9. **M-03** — 身份证字段加密存储
|
||
10. **I-03** — 实现退款后票状态更新
|
||
11. **I-08** — 修复 ALTER TABLE 兼容性判断
|
||
|
||
---
|
||
|
||
## 评审报告状态
|
||
|
||
| 报告 | Owner | 状态 | 主要发现 |
|
||
|---|---|---|---|
|
||
| `reviews/code-review-SecurityEngineer.md` | SecurityEngineer | ✅ 已合并到 main | 1严重+5中等+3轻微+4建议 |
|
||
| `reviews/code-review-BackendArchitect.md` | BackendArchitect | ✅ 已合并到 main | 5严重+4中等+4轻微+5建议 |
|
||
| `reviews/code-review-FrontendDev.md` | FrontendDev | ✅ 已合并到 main | 2严重+4中等+3轻微+4建议 |
|
||
|
||
---
|
||
|
||
## Phase Breakdown
|
||
|
||
| Phase | 内容 | 状态 |
|
||
|---|---|---|
|
||
| **Draft** | 各维度代码阅读 + 问题识别 | ✅ 完成 |
|
||
| **Review** | 输出完整评审报告 + 交叉验证 | ✅ 完成(3份报告已合并) |
|
||
| **Finalize** | 合并到 main,投票达成共识 | ✅ 完成 |
|
||
|
||
---
|
||
|
||
### 评审交叉验证结果
|
||
|
||
- SecurityEngineer 报告:✅ 全面覆盖安全维度,S-01 幂等性为最严重漏洞
|
||
- BackendArchitect 报告:✅ 架构分析深入,ALTER TABLE `empty($cols)` 错误为独立发现
|
||
- FrontendDev 报告:✅ 前端专项评审完整,M-05 响应式设计 / M-06 座位图边界为独立发现
|
||
- 三方交叉验证结论:**发现高度一致,24 项问题(4严重+7中等+5轻微+8建议),P0-P2 优先级明确**
|
||
|
||
---
|
||
|
||
**[CONSENSUS: YES]** — vr-shopxo-plugin 代码审议 Round 3 完成。3 份评审报告(SecurityEngineer / BackendArchitect / FrontendDev)已全部合并到 main,共发现 4 严重 + 7 中等 + 5 轻微 + 8 建议 = 24 项问题,P0-P2 修复优先级已明确。代码审议任务圆满结束。
|