Files
wecom_it_smart_desk/docs/03-测试文档/05-缺陷单
Simon 0042519f66 fix(security): P0-NEW12 调试端点代码层根因(debug.py 集中 + app_env 优先)
【触发】
2026-08-12 09:00 早班巡检:jumpserver-V2 容器内 `python urllib` 绕开 nginx 直测
FastAPI(backend:8000):
  - /test-ping 200 pong
  - /test-error 200 "服务器内部错误"
  - /version 200 1.1.0(含 git hash)
  - /openapi.json 404(P0-NEW11 已闭环)
真实风险:公网 404 全部依赖 nginx 边缘层兜底;若 nginx 配置被误改 /
失效 / 容器间网络可达 backend:8000,攻击者可拿到 3 个调试端点。

【修复(v1.0 + v1.1 二次修复)】
1. 新建 src/backend/app/api/debug.py 集中 3 个调试端点(/api/debug/ping
   /error /version),加双重门控:
   - 模块级:main.py `if _is_dev_mode():` 块内 include_router(debug_router)
   - 端点级:每个端点内部 _is_dev_mode() 二次校验(防 fail-open)
2. 删除 main.py 散落的 /test-ping /test-error /version
3. debug.py 的 _is_dev_mode() 委托 main.py:48 单一真源(避免三处定义漂移)
4. 【v1.1 二次修复】_is_dev_mode() / _dev_mode_enabled() 改为 app_env 优先:
   - 优先级 1: app_env=="production" → 永远 False(即使 DEV_MODE=true)
   - 优先级 2: 非 production → 看 DEV_MODE / settings.dev_mode
   同步修复 main.py + dev_auth.py(两个独立实现不能漏一处)
5. tests/conftest.py enable_dev_mode fixture 同步设 APP_ENV=development
   (避免 dev 测试 case 因 app_env 默认 production 而 fail)

【验证(公网 + 容器内)】
- 公网 12 端点:3 旧端点 404 + 3 新端点 404 + 3 dev 403(nginx IP 白名单)+
  1 health 200 + 3 P0-NEW11 404 
- 容器内直连 backend:8000 6 端点:100% 4xx (用户原话真实风险场景)
- 回归测试 10 passed + 1 skipped(psutil 缺包)

【部署】
jumpserver-V2 PSFTP + sudo cp + chown admin:admin + 清理 __pycache__ +
docker restart wecom_it_backend
  v1 部署:10:48
  v2 部署:10:55(app_env 优先修复后)

【关联】
- 缺陷单:docs/03-测试文档/05-缺陷单/BUG-安全-005-调试端点无门控-001.md
- 看板:项目状态看板 v1.9.7-DRAFT P0-NEW12  已修复
- 工作日志:.workbuddy/memory/2026-08-12.md
- MEMORY 铁律:.workbuddy/memory/MEMORY.md「调试端点铁律」5 条
2026-08-12 11:01:14 +08:00
..

05-缺陷单

目录定位: 本目录归 03-测试文档/ 下,专门承载 BUG 缺陷单据。 规范依据: docs/00-产品开发流程与文档管理规范.md § 2.2、§ 12


一、目录说明

缺陷单(BUG)是质量验证(阶段 4)的核心产出之一(spec § 1.1),承担"问题发现 → 根因分析 → 修复 → 验证 → 关闭"的闭环职责。

项目 说明
目录归属 03-测试文档/05-缺陷单/(不在 07-项目管理/,因为项目管理范畴只包含任务说明书/迭代/会议/看板)
命名规范 BUG-{模块}-{描述}-{序号}.md,符合正则 ^BUG-.*-\d+\.md$
模块取值 AI / 会话 / 坐席 / 用户 / 审批 / 知识 / 集成 / 运维 / 通用
必备章节 基本信息 / 复现步骤 / 根因分析 / 修复方案 / 验证结果 / 关联信息 / 变更记录
头部模板必填 缺陷编号 / 版本 / 状态 / 优先级 / 日期 / 人员

二、缺陷状态

状态 标记 说明
待处理 [待处理] 缺陷已确认,待指派
进行中 [进行中] 正在修复中
已修复 [已修复] 代码已修复,待验证
已验证 [已验证] 验证通过,缺陷关闭
已关闭 [已关闭] 缺陷修复并验证完成
延期 [延期] 暂不处理,推迟
无法复现 [无法复现] 无法复现,关闭

完整优先级与处理流程参考 spec.md § 12.2 / § 12.3。


三、当前缺陷清单(2026-07-28 维护)

缺陷编号 标题 状态 优先级 发现日期 关联需求
BUG-AI-001 打印机安装路由错误 [已修复] P2-Medium 2026-07-20 REQ-AI-路由
BUG-坐席-001 图片预览刷新问题 [待处理] P2-Medium 2026-07-20 REQ-坐席-080
BUG-坐席-002 选项汇总标签缺失(已选:xxx ✓) [已修复] P3-Low 2026-07-28 REQ-坐席-002
BUG-通用-001 用户角色分配表格看不清 [进行中] P2-Medium 2026-07-27 REQ-通用-003
BUG-通用-002 快速回复规则路由目标筛选 500 错误 [已关闭] P1-High 2026-07-28 REQ-通用-002
BUG-用户-001 坐席离线未限制呼叫人工 [已修复] P1-High 2026-07-25 REQ-用户-004
BUG-用户-002 H5 请求超时问题 [已修复] P1-High 2026-07-26 -

全量缺陷跟踪表维护在 docs/07-项目管理/缺陷跟踪表.md(如需)。


四、命名与目录纪律

4.1 命名禁止

  • BUG-{模块}-{描述}.md(缺序号)—— 警告
  • bug-{模块}-{描述}-{序号}.md(大小写错误)—— 重命名为 BUG-
  • {模块}-{描述}-BUG.md(后缀位置错)—— 按 BUG-{模块}-{...} 重排

4.2 目录放置禁止

错放位置 应放位置
docs/07-项目管理/BUG-*.md docs/03-测试文档/05-缺陷单/BUG-*.md
docs/01-产品文档/BUG-*.md docs/03-测试文档/05-缺陷单/BUG-*.md
docs/08-历史归档/BUG-*.md(如仍被引用) 提升回 05-缺陷单/,归档表迁 08-历史归档/

4.3 引用同步

引用场景 引用格式
PRD / 技术方案中提及 [BUG-模块-序号](../03-测试文档/05-缺陷单/BUG-模块-描述-序号.md)
任务说明书中提及 [BUG-模块-序号](../../../docs/03-测试文档/05-缺陷单/BUG-模块-描述-序号.md)
提交代码 commit message 含 [BUG-模块-序号] 修复 xxx

五、变更记录

日期 版本 变更内容 变更人
2026-07-28 v1.0 创建本目录;首批移入 5 份 BUG 单(AI/坐席/通用/用户×2) Duckula
2026-07-28 v1.1 追加 BUG-通用-002(快速回复规则路由目标筛选 500 错误);当前清单更新到 6 条 Duckula
2026-07-28 v1.2 追加 BUG-坐席-002(坐席端选项汇总标签缺失——v2.2 增量修复,已部署待人工验证);当前清单更新到 7 条 Duckula