vr-shopxo-plugin/docs/PHASE2_RESEARCH_ARCHIVE.md

212 lines
6.1 KiB
Markdown
Raw Permalink 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.

# Phase 2 — 研究资料归档
> 来源Council 讨论BackendArchitect + SecurityEngineer + FrontendDev5轮
> 整理:西莉雅(独立执行,非 Council 输出)
> 时间2026-04-15 CST
---
## 一、后台架构研究BR-1 ~ BR-5
### BR-1ThinkPHP 8 控制器层规范 ✅ 已验证
**Key Questions 结论:**
| 问题 | 答案 |
|------|------|
| ShopXO Admin 控制器基类 | `app\admin\controller\Common`,非 `BaseController` |
| 获取当前 admin id / role | `$this->admin['id']`,由 `Common::__construct()` 注入 |
| API 返回格式 | `\Json::成功()` / `\Json::fail()` 渲染器 |
| 分页参数规范 | `page` + `limit`ThinkPHP 默认) |
| 新增 controller 路由 | 无需声明ShopXO 自动扫描 |
**插件 Base 正确写法:**
```php
abstract class Base extends \app\admin\controller\Common {
public function __construct() {
parent::__construct(); // 触发 IsLogin + IsPower + ViewInit
}
}
```
---
### BR-2多角色鉴权模型 ⚠️ 部分实现
| 问题 | 现状 | 待 Phase 3 |
|------|------|-----------|
| ShopXO admin 角色结构 | `vrt_admin` + `vrt_admin_role`RBAC | — |
| 核销员复用 admin 表? | **否**,独立表 `vr_verifiers` | — |
| 权限隔离方案 | 目前所有 admin 可访问所有插件功能 | 实现 RBAC 细化 |
---
### BR-3数据库查询优化 ✅ 已实现
| 场景 | 解决方案 |
|------|---------|
| 大数据量导出 | `cursor()` 流式游标(防 OOM |
| 模糊搜索 | ThinkPHP 查询构造器(自动绑定参数) |
| 分页 | `paginate(20)` |
| N+1 | `column()` / `select()` + PHP 拼接 |
---
### BR-4核销操作事务一致性 ✅ 已实现
```php
Db::transaction(function() {
$ticket = Db::name('tickets')
->where('ticket_code', $ticket_code)
->lock(true) // FOR UPDATE SKIP LOCKED
->find();
// 状态校验 + 更新 + 写入 vr_verifications
});
```
---
### BR-5事件驱动/异步队列 ❌ 待 Phase 3
- ShopXO 有 `think_queue`Redis/DB
- 核销通知同步执行暂无问题,队列化留 Phase 3
---
## 二、安全研究方向R-1 ~ R-5
### R1Admin 控制器鉴权风险 ✅ 已解决
**根因:** 插件 `Base` 只调 `LoginInfo()`,未调用 `IsLogin()` + `IsPower()` + `FormTableInit()`
**修复后鉴权链:**
```
ThinkPHP → admin.php → Common::__construct()
1. AdminService::LoginInfo() — 填充 $this->admin
2. AdminPowerService::PowerMenuInit() — 权限菜单
3. ViewInit() — 视图初始化
→ 插件控制器extends Base→ parent::__construct()
→ 完整继承上述 3 步
```
**Defense-in-Depth 建议:**`Base::__construct()` 末尾显式调用 `$this->IsLogin()`
---
### R2SQL 注入风险 ✅ 无注入
| 控制器 | 查询点 | 输入处理 | 结论 |
|--------|--------|----------|------|
| SeatTemplate::list | `name` like, `status` | `null` + `intval()` | ✅ |
| Ticket::list | `keywords` multi-field like | `trim()` + 查询构造器绑定 | ✅ |
| Ticket::verify | `ticket_code`, `verifier_id` | `trim()` + `intval()` | ✅ |
| Verification::list | date range | `strtotime()` 绑定 | ✅ |
---
### R3XSS / CSRF ✅ 低风险
| 方面 | 状态 |
|------|------|
| CSRF Token (POST) | ✅ ShopXO 保护 |
| XSS存储型 | ✅ 低风险admin 上下文) |
| 关键操作 guard | ✅ `delete()` / `verify()` / `export()` 均有 `IS_AJAX_POST` |
---
### R4敏感操作审计日志 ✅ 已实现
**vr_audit_log 字段:**
`action` / `operator_id` / `operator_name`(冗余) / `target_type` / `target_id` / `target_desc`(冗余) / `client_ip`IPv6 / `user_agent` / `request_id` / `extra`JSON快照 / `created_at`
**索引:** `idx_action` / `idx_operator_id` / `idx_target` / `idx_created_at`
**防篡改:** append-only 表,无 UPDATE/DELETE 接口。
---
### R5水平越权IDOR✅ Admin 上下文安全
**潜在盲区(待 Phase 3**
- 核销员详情/编辑接口是否校验归属机构?
- 电子票详情接口是否校验持票人身份?
- 核销记录查询是否仅返回当前核销员/机构记录?
---
## 三、前端研究方向FR-1 ~ FR-5
### FR-1ShopXO Admin UI 框架 ✅ Layui
| 选项 | 结论 |
|------|------|
| Layui 2.x | ✅ 继续使用,零迁移成本 |
| Vue 3 | ❌ 不支持,混用会导致冲突 |
---
### FR-2ShopXO Admin 风格适配 ✅ 已适配
```php
// ✅ 正确
PluginsAdminUrl('vr_ticket/ticket/list')
// ❌ 错误
MyUrl('ticket/list')
```
---
### FR-3座位图编辑器 ⚠️ 待 Phase 3
- 需产品需求确认Canvas/SVG/Grid
- `seat_map` JSON 字段已预留
---
### FR-4数据导出方案 ✅ CSV 已实现,.xlsx 待 Phase 3
| 项目 | 现状 |
|------|------|
| CSV 导出 | ✅ `cursor()` 流式,防 OOM |
| 导出按钮 | ✅ POST-only form |
| Excel .xlsx | ❌ 待 Phase 3 |
---
### FR-5响应式与权限控制 ⚠️ 部分实现
- 权限体系复用 ShopXO RBAC
- 移动端 PAD 核销场景待 Phase 3
---
## 四、Phase 3 待办清单
### 需产品确认
- [ ] FR-3座位图可视化编辑器需求
- [ ] FR-5PAD 核销场景是否需要独立移动端页面?
- [ ] BR-2核销员账号体系复用 admin 还是独立?)
### 技术待办
- [ ] Defense-in-Depth`Base::__construct()` 末尾显式调用 `IsLogin()`
- [ ] R5 盲区验证IDOR 归属校验
- [ ] BR-5核销通知队列化think_queue
- [ ] FR-4CSV 导出携带搜索条件
- [ ] FR-4Excel .xlsx 格式支持
- [ ] BR-2插件独立权限菜单级/操作级)
---
## 五、关键文件索引
| 文件 | 说明 |
|------|------|
| `app/plugins/vr_ticket/admin/controller/Base.php` | 鉴权基类(已修复) |
| `app/plugins/vr_ticket/service/AuditService.php` | 审计日志服务 |
| `app/plugins/vr_ticket/service/TicketService.php` | 核销事务(含 FOR UPDATE |
| `app/plugins/vr_ticket/admin/controller/Ticket.php` | 电子票 CRUD + export |
| `app/plugins/vr_ticket/admin/controller/Verifier.php` | 核销员管理 |
| `app/plugins/vr_ticket/EventListener.php` | vr_audit_log 建表 SQL |
| `shopxo/app/admin/controller/Common.php` | ShopXO 鉴权链源码 |