vr-shopxo-plugin/plan.md

98 lines
4.1 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 2 — 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/BA |
| 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** | 各 Agent 交叉评审 + 投票 | ⏳ 进行中 |
---
**[CONSENSUS: NO]** — 3 份评审报告已就位,进入 Finalize 阶段,等待各 Agent 投票