vr-shopxo-plugin/plan.md

108 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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. 数据库 Schema001_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` XSSsimple_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 修复优先级已明确。代码审议任务圆满结束。