3.7 KiB
3.7 KiB
2026-09-08 只读复检(未改代码)
- 用户要求只检查不动代码。后端已重启(运行的是当日12:10编译的最新代码,IDE加载target/classes)。
- 复检结论:9/3 报告的严重问题均未修复:
- X-User-Id 伪造身份仍可复现(普通用户带 X-User-Id:19 拿到管理员 profile)
- /sys/api/admin 的 wecom-app-config(secret明文)/report-reminder-config/dashboard-analytics-config 普通用户仍可读
- JWT 默认密钥 change-me-please-change-me-32bytes 仍在(application.yml + application-prod.yml 第53/51行)
- 参数缺失仍返回 500(仅补了 404 NoResourceFoundException 的 handler)
- CORS 仍反射任意 Origin + Allow-Credentials:true
- 新增改动(9/3后,工作区未提交,57文件/约5.7k行):ExpansionServiceImpl +566 行新增渠道↔CRM 互转(moveChannelToCrm/moveCrmToChannel,结构合理,有归属校验+关联迁移+事务);Opportunity OMS 反写阶段 normalizeStageValue、S5已签约同步;Work 日报正文 stripCrmEditorBody;前端 auth.ts/Expansion.tsx 等大改
- 单测仍 113 个 2 失败:ExpansionServiceImplTest 渠道重名校验 vs 联系人必填校验顺序(与9/3相同根因,测试改过仍不过)
- 前端 tsc --noEmit 通过
- 核心读接口全 200;互转/跟进等对不存在 id 错误处理正确
- 测试账号 token 存 /tmp/crm_tokens2.env(9/8新登录,原9/3 token已过期/被刷新)
9/8 追加:商机名称查重功能只读复查(未改代码)
- 用户新增"商机名称查重",请求复查。检查期间用户仍在改代码并反复编译(target 14:11→14:15→14:16 更新),最终磁盘版:XML selectDuplicateOpportunities 去掉了 select distinct(曾有一版
select distinct + order by coalesce(updated_at...)在 PG 必报 InvalidColumnReference,psycopg2 直连 202 库实测复现),DTO 重构为 OpportunityDuplicateCheckDTO.Item 内嵌类(OpportunityDuplicateItemDTO 已删),Mapper/Service/Controller 全部配套。 - 功能形态:Controller /api/opportunities/duplicate-check(name, excludeId?, excludeStageCodes?) → Service 全表同名精确匹配(去空格+upper,归档剔除,excludeId/排除阶段支持) → 前端提交时才查,命中弹窗"仍然新增"可继续(软提示),编辑不查重。
- 实证(运行实例):单值 excludeStageCodes=L 正常;excludeStageCodes 传≥2 个值(或逗号分隔) 接口 500(overview 同病),前端 URLSearchParams 会逐个 append → 当前字典只有 1 个丢单阶段(L-已丢单) 所以线上不触发;字典一旦有 ≥2 个丢单/放弃阶段即致查重 500 且前端 catch 吞错放行(静默失效)。dashboard cardKeys 多值 200 排除 Spring 绑定问题 → 疑在商机 SQL/MyBatis foreach 路径,未拿到堆栈(无落盘日志)。
- 其余发现:查重 SQL 无 userId/可见性过滤(对照列表/详情均带 visibility)→ 全库同名探测+返回他人商机明细(越权读取/泄露,中高);后端 create/update 无唯一校验、表无唯一约束,"仍然新增"按钮无 submitting 防抖,双击可并发建两条同名(2233 即在测试中被创建);编辑可改名但不查重且 excludeId 参数前端从不传(功能未闭环);查重谓词函数包裹列无索引(量级小暂可);规范化只去空格+ASCII大写,全角字符/NBSP 可绕过。
- 环境疑点:运行实例数据(id 2228/2229/2230/2231/2233 等)与 application.yml 指向的 192.168.124.202/unis_crm_dev 不一致(该库实为 2228/2229/2232) → IDE 运行配置数据源被覆盖(profile/env),测试库≠配置文件库,发版前需核对。psycopg2-binary 已装入 ~/.workbuddy/binaries/python/envs/default(202 库 postgres/unis@123 只读排查用)