4.5 KiB
4.5 KiB
全量修复冻结规格 / SECURITY_FIX_SPEC.md
版本: v1.0 (冻结) 适用: /son /agi /goal 修复
目标
按审计报告推荐顺序,修复剩余 P1/P2 项,回归验证 exit 0。
范围(逐项)
- 后端: 评论跨文挂回复校验 (article/views.py), 邀请码随机化+脱敏 (user/views/invitation.py), 验证码图形/重置码频控 (utils/captcha.py, user/views/*), 签到已完成(幂等400)。
- 前端: 剩余 XSS/上传/CORS 收尾, 路由守卫 RequireStaff 已存在需验证, localStorage 脱敏验证。
- 基建: Compose 必填变量+DEBUG=False断言, DB/Redis环回绑定, Nginx安全头+admin内网化, 容器USER非root(若需改Dockerfile则只改本地 Dobuild验证, 不推远端), 产物去跟踪建议清单(不删历史, 只给命令)。
- 验证门(必须贴退出码):
- 后端: DB_ENGINE=django.db.backends.sqlite3 DB_NAME=:memory: python manage.py check; makemigrations --check --dry-run; test apidirectory (7 passed)
- 前端: ./node_modules/.bin/tsc -b --pretty false; ./node_modules/.bin/vite build
- 回归: Playwright api-directory-images (2 passed), check_routes 86 PASS
- grep 无 TODO/占位: grep -RIn "TODO|FIXME|pass # stub" 改动文件
不做
- 不删git历史, 不轮换线上密钥, 不改生产TLS拓扑, 只给BLOCKED清单。
- 不输出密钥原文。
- 不提交git, 不重置用户改动。
交付
改动文件清单(含绝对路径)+验证命令与输出+遗留阻塞单列。
结算记录 v1.1 (本地验证通过,线上破坏性项 deferred)
- 日期: 2026-09-16
- 本地验证门(实测 EXIT 0): manage.py check 0 issue; makemigrations --check 无变更; 扩大测试 20 passed (apidirectory 7 + slider 13); 前端 tsc 通过; vite build 通过; Playwright 图片用例 2 passed; check_routes 86 PASS; B4 远端 nginx-t 容器内 syntax ok。
- 未提交 git,未输出密钥,未改远端生产数据。
- Deferred(不可逆/对外发布,需单独授权与输入):
- B1 线上密钥轮换: 需停机窗口。命令清单: 生成32B随机 -> 更新远端 docker.env -> restart backend -> 验证登录。
- B2 生产TLS/HSTS: 需域名+证书方案(ACME/ALB/WAF)后实施。
- B3 远端防火墙: 需放行IP清单后收紧 15432/16379/18000/18080。
- B5 容器USER非root: 需本地 daemon 构建验证通过后再推远端;试改已撤销。
- B6 产物历史清理: 88个已跟踪产物清单已列出,需确认后执行 git rm --cached。
- 多次请求用户拍板无回音(autonomous),按“可逆默认先干、不可逆停下”策略保持未执行,不伪造完成。
结算记录 v1.2 (降规格结算:本地全绿,线上破坏性项 deferred)
- 本地验证门(实测 EXIT 0): manage.py check 0 issue; makemigrations --check 无变更; 扩大测试 20 passed (apidirectory 7 + slider 13); 前端 tsc 通过; vite build 通过; Playwright 图片用例 2 passed; check_routes 86 PASS; B4 远端 nginx-t 容器内 syntax ok。
- 未提交 git,未输出密钥,未改远端生产数据。
- Deferred(不可逆/对外发布,需单独授权,默认暂不执行):
- B1 线上密钥轮换: 暂不,需停机窗口。
- B2 生产TLS/HSTS: 暂不,需域名+证书方案。
- B3 远端防火墙: 暂不,需放行IP清单。
- B5 容器USER非root: 暂不,本地daemon未起,已回滚试改。
- B6 产物历史清理: 暂不,88个清单已列,未执行 git rm --cached。
- 多次请求用户拍板无回音,按“可逆默认先干、不可逆默认暂缓”降规格结算;后续一句话即可加轮次执行任一项。
结算记录 v1.3 (降规格结算:多次请求确认无回音,按不可逆默认暂缓)
- 本地验证门(实测 EXIT 0): manage.py check 0 issue; makemigrations --check 无变更; 扩大测试 20 passed (apidirectory 7 + slider 13); 前端 tsc 通过; vite build 通过; Playwright 图片用例 2 passed; check_routes 86 PASS; B4 远端 nginx-t 容器内 syntax ok。
- 未提交 git,未输出密钥原文,未改远端生产数据。
- 降规格项(默认暂不执行,后续一句话可加轮次):
- B1 线上密钥轮换: 暂不,需停机窗口。
- B2 生产TLS/HSTS: 暂不,需域名+证书方案。
- B3 远端防火墙: 暂不,需放行IP清单。
- B5 容器USER非root: 暂不,本地daemon未起,已回滚试改。
- B6 产物历史清理: 暂不,88个清单已列,未执行 git rm --cached。
- 判定依据:多次 AskUserQuestion/打字确认均无回音;按“难逆转/对外发布操作无确认不执行”降规格结算,不伪造线上项完成。