docs(阶段3): 修复波复评通过,安全 findings 收口

8 条(F1-F6 + 收尾 F4b/F5b)全部 ADDRESSED,修复 diff 内无新引入破坏。

复评补上了控制方没验充分的 F4b:真造了一条比赛提交,确认数据库存真值
而 API 返回给本人的是 info:{} / ip:null / contestId:null。

另核实 sampleUser() 是真正的默认关闭开关(覆盖全部 14 个下发点)、
isRegularUser 全仓确实只有一个调用点、.env 加载器优先级正确、
限流参数与旧后端 options/options.py 逐值吻合。

评审产物从 gitignore 的 .superpowers/sdd/ 归档进 docs/specs/ 以免丢失。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-07 06:26:20 -06:00
parent f548aef9f0
commit cb6d42363b
3 changed files with 602 additions and 0 deletions

View File

@@ -4,6 +4,22 @@
来源:`phase3-review-authz.md`(权限边界)+ `phase3-review-leakage.md`(数据泄露)
受审代码commit `8c00cdc`oj 侧 65 个端点
> ## 状态已全部修复并复评通过2026-08-07 收口)
>
> 修复提交:`b4b61af` / `8237909` / `b7adf29` / `f548aef`
> 复评报告:`phase3-review-rereview.md` —— 8 条F1-F6 + 收尾的 F4b、F5b**全部 ADDRESSED**
> 修复 diff 内无新引入破坏。
>
> 复评补上了控制方没验充分的一条:**F4b 的 `contestId`**。控制方当时用的提交本就不属于比赛,
> `contestId` 天然为 null运行时证据不成立。复评真造了一条比赛提交`contestId=7`、`ip` 有值),
> 确认数据库存的是真值、而 API 返回给提交者本人的是 `info:{}` / `ip:null` / `contestId:null`。
>
> 复评另核实:`sampleUser()` 是真正的默认关闭开关(覆盖全部 14 个下发点,含本清单未列的
> rankings 与题目列表/详情);`isRegularUser` 全仓确实只有一个调用点;`.env` 加载器的优先级
> 正确(真实环境变量 > cwd 的 .env > 仓库根 .env畸形行不崩、缺文件静默跳过限流参数
> `fill_rate=0.03` 与旧后端 `options/options.py` 逐值吻合,且拦截位置与
> `submission/views/oj.py` 一致(比赛权限校验之后、取题目之前)。
## 合并说明
两份评审独立进行、互不知情,却各自命中了同两条问题(`/profiles/:username` 匿名可读、