bujinyuan
cdaa39d686
fix(meeting): Task 16 修复 code-reviewer 审计 P0 四项 + 落盘审查报告
code-reviewer 子代理(docs/reviews/2026-04-23-phase2e-2-code-review.md)对 Phase 2e-2
整体做全栈审计,暴露 P0 × 4 / P1 × 8 / P2 × 8 / Nit × 11。本次先修 P0:
- P0-1 / P0-2 媒体资源归属越权:
新增 assertOwnsResource(roomCode, userID, kind, id) helper,用 resourceTrackKey Redis Set
SIsMember 校验 transport/producer/consumer 归属;统一接入 OnTransportConnect /
OnProduceStart / OnConsumeStart / OnConsumeResume / OnProducerClose 五个信令入口,
一次封死同类横向越权漏洞(Redis 查询失败时 fail-closed,避免抖动开口子)。
新增 service.ErrResourceNotOwned 错误常量。
- P0-3 CreateRoom Router 失败吞错:
旧实现 mediaErr != nil 仅 logs.Warn 继续返回成功 → zombie 房间 + 入会必败 +
一人一会议名额被占。改为 fail-closed 补偿:LeaveRoom + MarkEnded(system_error) +
返回新 service.ErrMediaServiceUnavailable,controller.handleError 映射为 500。
- P0-4 会议密码明文走 URL:
join.vue onNext 旧逻辑把密码拼 ?password=xxx,浏览器历史 / DevTools 留痕。
新增 meetingStore.draftJoinPayload 内存态草稿,join.vue 只跳转
?mode=join&code=xxx,preview.vue onLoad 读取后立即 draftJoinPayload = null 清空,
邀请链接里的 password 参数一律忽略。
验证:
- cd backend/go-service && go build ./... 通过
- cd frontend && npm run build:h5 通过
- 仅剩 1 个预先存在 unusedparams warning,与本次改动无关
P1 / P2 / Nit 清单保留在审查报告,按顺序继续处理。
Made-with: Cursor
2026-04-23 16:34:13 +08:00
..
2026-04-23 16:34:13 +08:00
2026-04-21 18:21:04 +08:00
2026-04-21 18:21:04 +08:00
2026-04-21 16:39:59 +08:00
2026-04-21 16:04:57 +08:00
2026-03-02 11:31:24 +08:00
2026-03-02 11:31:24 +08:00
2026-04-20 11:53:27 +08:00
2026-04-21 16:04:57 +08:00