[优化-P2] 7个轻微问题与改进建议 #8

Closed
opened 2026-04-15 01:47:45 +00:00 by sileya-ai · 3 comments

🟢 L-01:AES-CBC 无认证加密

文件: service/BaseService.php:56-60
来源: Council 三方共识

AES-256-CBC 无 HMAC,密文被篡改后解密可能仍成功(padding oracle 理论风险)。建议升级为 AES-GCM。


🟢 L-02:seatInfo.classes 直接插入 HTML class

文件: view/goods/ticket_detail.html:271
来源: Council 架构评审

若 seat_map JSON 被 admin 篡改,可注入任意 CSS 类破坏页面(需要 admin 权限)。


🟢 L-03:字符集混用

文件: EventListener.php 建表语句
来源: Council 架构评审

插件表用 utf8mb4_general_ci,ShopXO 官方表用 utf8mb4_unicode_ci,JOIN 时排序可能不一致。


🟢 L-04:座位图字符集 ASCII 单字符限制

文件: view/goods/ticket_detail.html:261
来源: Council 前端评审

座位用单字符(A/B/C/_/-)标识,若需情侣座、多舞台等场景需要重构。


💡 I-01:upgrade() 空实现

文件: EventListener.php:136-139
来源: Council 三方共识

无版本迁移框架。未来表结构变更无法平滑升级。


💡 I-02:plugins_service_order_delete_success 声明但无处理

文件: plugin.json:24 / EventListener.php
来源: Council 三方共识

退款后票状态不更新,已退款用户仍可持票入场。


💡 I-03:spec_base_id 缺少独立索引

文件: EventListener.php 建表语句
来源: Council 三方共识

vr_tickets 表仅有 (goods_id) 联合索引,无单独的 spec_base_id 索引,影响按场次查询的性能。

## 🟢 L-01:AES-CBC 无认证加密 **文件:** service/BaseService.php:56-60 **来源:** Council 三方共识 AES-256-CBC 无 HMAC,密文被篡改后解密可能仍成功(padding oracle 理论风险)。建议升级为 AES-GCM。 --- ## 🟢 L-02:seatInfo.classes 直接插入 HTML class **文件:** view/goods/ticket_detail.html:271 **来源:** Council 架构评审 若 seat_map JSON 被 admin 篡改,可注入任意 CSS 类破坏页面(需要 admin 权限)。 --- ## 🟢 L-03:字符集混用 **文件:** EventListener.php 建表语句 **来源:** Council 架构评审 插件表用 utf8mb4_general_ci,ShopXO 官方表用 utf8mb4_unicode_ci,JOIN 时排序可能不一致。 --- ## 🟢 L-04:座位图字符集 ASCII 单字符限制 **文件:** view/goods/ticket_detail.html:261 **来源:** Council 前端评审 座位用单字符(A/B/C/_/-)标识,若需情侣座、多舞台等场景需要重构。 --- ## 💡 I-01:upgrade() 空实现 **文件:** EventListener.php:136-139 **来源:** Council 三方共识 无版本迁移框架。未来表结构变更无法平滑升级。 --- ## 💡 I-02:plugins_service_order_delete_success 声明但无处理 **文件:** plugin.json:24 / EventListener.php **来源:** Council 三方共识 退款后票状态不更新,已退款用户仍可持票入场。 --- ## 💡 I-03:spec_base_id 缺少独立索引 **文件:** EventListener.php 建表语句 **来源:** Council 三方共识 vr_tickets 表仅有 (goods_id) 联合索引,无单独的 spec_base_id 索引,影响按场次查询的性能。
sileya-ai self-assigned this 2026-04-15 01:47:45 +00:00
Poster
Owner

西莉雅审核(2026-04-15)

子问题 状态 备注
L-01 AES-CBC 无认证 ⚠️ 仍在 仍用 AES-CBC,GCM 升级待 Phase 3
L-02 seatInfo.classes 注入 ⚠️ 仍在 直接拼入 class 属性
L-03 字符集混用 ⚠️ 仍在 utf8mb4_general_ci vs unicode_ci
L-04 座位图字符限制 ⚠️ 仍在 单字符限制,情侣座等场景需重构
I-01 upgrade() 空实现 ⚠️ 仍在 无版本迁移框架
I-02 退款后票状态不更新 ⚠️ 仍在 plugins_service_order_delete_success 未处理
I-03 spec_base_id 缺索引 ⚠️ 仍在 vr_tickets 无 spec_base_id 独立索引

Issue #8 全部问题仍在,等 Phase 3 处理。

⚠️ 本审核为西莉雅独立核查,非 Council 二次复查

**西莉雅审核(2026-04-15)** | 子问题 | 状态 | 备注 | |--------|------|------| | L-01 AES-CBC 无认证 | ⚠️ 仍在 | 仍用 AES-CBC,GCM 升级待 Phase 3 | | L-02 seatInfo.classes 注入 | ⚠️ 仍在 | 直接拼入 class 属性 | | L-03 字符集混用 | ⚠️ 仍在 | utf8mb4_general_ci vs unicode_ci | | L-04 座位图字符限制 | ⚠️ 仍在 | 单字符限制,情侣座等场景需重构 | | I-01 upgrade() 空实现 | ⚠️ 仍在 | 无版本迁移框架 | | I-02 退款后票状态不更新 | ⚠️ 仍在 | `plugins_service_order_delete_success` 未处理 | | I-03 spec_base_id 缺索引 | ⚠️ 仍在 | vr_tickets 无 spec_base_id 独立索引 | **Issue #8 全部问题仍在,等 Phase 3 处理。** > ⚠️ 本审核为西莉雅独立核查,非 Council 二次复查
Poster
Owner

更新(2026-04-15 15:51):I-03 已由 Claude Code 修复并推送

commit 917104643fix(migration): add missing indexes + fix ALTER TABLE PDOStatement bug

修复内容:

  • vr_tickets: 补 idx_created_at + idx_spec_base_id
  • vr_verifications: 补 idx_verified_at
  • ALTER TABLE: empty($cols)$cols->rowCount() == 0

西莉雅二次复查: 通过。

**更新(2026-04-15 15:51):I-03 已由 Claude Code 修复并推送** commit `917104643` — `fix(migration): add missing indexes + fix ALTER TABLE PDOStatement bug` 修复内容: - vr_tickets: 补 `idx_created_at` + `idx_spec_base_id` - vr_verifications: 补 `idx_verified_at` - ALTER TABLE: `empty($cols)` → `$cols->rowCount() == 0` **西莉雅二次复查:✅ 通过。**
Poster
Owner

核查结果

L-01 AES-CBC 无 HMAC - 理论风险(AES-CBC + 随机 IV 对一般应用足够安全)。可接受现状,未来可升级 AES-GCM。

L-02 seatInfo.classes HTML 注入 - 需要 admin 篡改 seat_map,风险极低。可接受现状。

L-03 字符集混用 (general_ci vs unicode_ci) - 已知不一致性,对排序有轻微影响。插件建表已使用 utf8mb4_general_ci,可接受现状。

L-04 单字符座位标识 - 已知限制,情侣座等场景需重构。可接受现状。

I-01 upgrade() 空实现 - 无版本迁移框架。未来表结构变更时补充。

I-02 退款后票状态不更新 - 重要业务逻辑缺口。如果支持退款,需实现 plugins_service_order_delete_success 钩子将票标记为已退款(verify_status=2),否则退款订单的票仍可入场。建议列入 Phase 3。

I-03 spec_base_id 索引 - 已修复(commit 917104643)。

结论:L-01~04/I-01/I-03 可接受现状或已修复,I-02(退款钩子)建议列入 Phase 3。

## 核查结果 **L-01 AES-CBC 无 HMAC** - 理论风险(AES-CBC + 随机 IV 对一般应用足够安全)。可接受现状,未来可升级 AES-GCM。 **L-02 seatInfo.classes HTML 注入** - 需要 admin 篡改 seat_map,风险极低。可接受现状。 **L-03 字符集混用 (general_ci vs unicode_ci)** - 已知不一致性,对排序有轻微影响。插件建表已使用 utf8mb4_general_ci,可接受现状。 **L-04 单字符座位标识** - 已知限制,情侣座等场景需重构。可接受现状。 **I-01 upgrade() 空实现** - 无版本迁移框架。未来表结构变更时补充。 **I-02 退款后票状态不更新** - 重要业务逻辑缺口。如果支持退款,需实现 `plugins_service_order_delete_success` 钩子将票标记为已退款(verify_status=2),否则退款订单的票仍可入场。建议列入 Phase 3。 **I-03 spec_base_id 索引** - ✅ 已修复(commit 917104643)。 结论:L-01~04/I-01/I-03 可接受现状或已修复,I-02(退款钩子)建议列入 Phase 3。
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: sileya-ai/vr-shopxo-plugin#8
There is no content yet.