| V-15 |
错误泄露收敛(envelope 净化)残留四个洞:① "失败:"截断只匹配半角冒号——media.go:188 与 menu.go:65 用全角":"拼接绕过;② 17 处截断不可命中的调用漏网(无冒号紧贴 15 处:api.go:137,156、authority.go 9 处、menu.go:170,178,198、user.go:150;全角 2 处)——非黑名单底层错误(x509/驱动方言)原样透出;③ payment TestProvider data 字段绕过——data/payment/payment.go:79-139 各阶段仍把原始 err.Error() 写入 Stages[].Message,而 Write 只净化 msg、CodeError 的 data 通道完全无净化机制(:87 是当前唯一实例但机制敞开);④ 净化静默无日志——response.go 无日志导入,替换发生无记录("不泄露也不可排障")。另有误伤:黑名单含 provider/sdk/connection/timeout 等宽泛词会误伤合法业务消息;约 45 处半角冒号调用的 biz 可读提示被截断抹平。净化逻辑零测试。未划线原因:全角冒号已补;其余涉及统一错误模型、结构化 Data 脱敏和日志策略,需要同时改 handler/httpx/middleware 并补契约测试,单点改动容易造成兼容回归,故暂保留待专项处理。 |
server/httpx/response.go:32-57;data/payment/payment.go:79-139;handler/payment.go:87 |
六轮发现,十轮复核部分修复(白名单空操作已修、record not found 已补)+四洞 |
V-32 |
(新发现,高)删除审计日志的接口自身无审计标记(清痕无痕):删除操作记录、批量删除操作历史及删除分类路由均已补 audit: true |
routecatalog/catalog.go |
十轮 |
| V-33 |
(新发现,中高)支付指纹严格相等校验对存量订单幂等重放的冲突风险:biz/payment/payment.go:652 order.RequestFingerprint != paymentOrderFingerprint(req, extra) 严格相等、无算法版本/迁移字段——Z-3 指纹统一前存量 initialized/pending 订单若由旧算法(data 层整结构 marshal)写入指纹,客户端超时重放同 TradeNo 将报"支付订单参数冲突"而非幂等短路,存量未支付订单无法重新拉起支付。建议对 initialized 态提供指纹重算/兼容窗口。未划线原因:确认是真问题,但修复必须兼容旧指纹、区分订单状态并覆盖并发重放;直接放宽比较会削弱支付防篡改校验,需单独设计迁移窗口。 |
biz/payment/payment.go:645-657;data/payment/payment_order.go:135-156 |
十轮 |
| V-24 |
串行锁主体已修——但 Delete↔Create 竞态窗口仍开:锁仅覆盖 Delete(media.go:126-143),引用同一 Key 的写入路径均不持锁(秒传 InitUpload→CreateMedia、普通 Upload 引用计数+建记录、CompleteUpload 的 CreateMedia)——T1 Delete 读 count=1 判定删除、T2 秒传 CreateMedia 复制同 Key 落库、T1 files.Delete → T2 新记录指向已删文件。锁为进程级 sync.Mutex,多副本部署跨进程无效。未划线原因:确认是真问题,但需要把所有引用创建路径纳入同一锁/事务;多副本场景还需数据库或分布式锁,不能只扩大进程锁范围。 |
biz/system/media.go:50,111-143;media_upload.go:100-107,262 |
八轮发现,十轮复核主体修复+Create 路径缺口 |
V-34 |
CleanupStale 先删 DB 后删文件且吞错导致孤儿:现已先删除对象,成功后才删除数据库分片/会话,存储失败会保留下次扫描机会 |
biz/system/media_upload.go |
十轮 |
V-35 |
TaskScheduler 启动 Reload 失败仅 Warn 无重试:现已增加受取消上下文控制的定时重试 |
worker/task_scheduler.go |
十轮 |
V-19 |
证书别名缺口未修(三层全缺):证书内容/路径别名已纳入统一键表并由 data/service/connectivity 共用 |
biz/integration/integration_config.go |
十轮复核 |
| V-13b |
swagger 残留:① 空 env fail-open 未修(gin.go:68 env == "" 仍注册,生产漏配 env 即暴露);② 双清单判定不一致——gin.go 白名单 {空,development,dev,test,local} vs main.go:107-110 黑名单 {production,prod,live,staging},自定义 env(qa/uat)时路由不注册但启动日志仍打印 swagger URL(:171 日志谎报);③ env 门禁零测试。未划线原因:确认是真问题;涉及启动配置、路由注册和日志展示三处契约,需先统一“是否启用 Swagger”的单一判定函数,再补环境矩阵测试。 |
server/gin.go:64-70;cmd/main.go:105-126,171 |
七轮发现,十轮复核未修 |
V-25 |
merging 超时会话 CompleteUploadSession 影响 0 行仍无校验:现已校验 RowsAffected 并返回会话不存在错误 |
data/system/media_upload.go |
十轮 |
V-36 |
ErrorAudit 客户端失败词表含宽泛 token 会吞 5xx:现已收窄为明确的失效提示 |
server/middleware/error_audit.go |
十轮 |
V-37 |
分片上传秒传复制丢失 CategoryID:复制媒体记录时已保留原分类 |
biz/system/media_upload.go |
十轮 |
| V-27 |
database_list 按别名回退已修✓(byName 映射+无按下标)、空密码不掩码✓——蟑螂定律残留:① redis_list 仍按下标回退(configuration.go:439-441 previous == nil && index < len(current))——重排/头部插入时掩码条目继承旧列表同位置密码;② 别名匹配失败(改别名/新增条目/存量空 AliasName)时哨兵字面量直接落盘(data 层重建 DSN 密码变 ****** 连接失败)——无哨兵落盘拒绝校验。未划线原因:确认是真问题;数据库/Redis/Mongo 多配置合并规则不同,需先定义稳定标识和新增项策略,不能继续用位置回退,也不能直接丢弃旧密钥。 |
internal/initialize/configuration.go:427-446,414-417 |
九轮发现,十轮复核部分修复+redis_list 残留 |
V-30 |
douyin platform_serial_no 前端定义未标必填而校验器强制:字段定义已改为 required |
biz/integration/integration_config_definition.go |
十轮复核 |
| V-20 |
前端 token 拼入 URL(完整登录 JWT 拼二维码 URL,账户主凭证泄露面;无轮换机制)。未划线原因:确认是真问题;需要后端签发一次性、短时效二维码票据并同步调整扫码接口,单改前端会直接破坏现有扫码登录协议。 |
web/src/components/upload/QR-code.vue:55 |
六轮,未修复 |
V-16b |
词表与八轮一致——applet 仅 wechat_v2/v3/douyin 有;allinpay 无 jsapi/mini 分支;测试缺口仍在:复核为支付渠道能力差异,不是统一协议缺陷;AllinPay 交易类型需按渠道协议扩展,当前不做无需求适配 |
integration/payment 各渠道文件 |
七轮复核:产品能力差异 |
| V-38 |
(新发现,低)AGENTS.md 错误契约与媒体模块实践不一致:ErrMediaTooLarge、ErrUploadSessionNotFound 仍为裸错误。未划线原因:确认是契约一致性问题,但当前调用方依赖 errors.Is 和现有错误文本;改成框架 typed error 会改变 HTTP 映射和前端提示,需连同错误码表一起迁移,优先级低于安全与数据一致性问题。 |
biz/system/media.go:52、media_upload.go:21 |
十轮 |
| V-31 残留 |
FindMedia 已映射 ErrMediaNotFound✓——同包 UpdateMediaName(media.go:125-127)仍透传 gorm 原文(404 语义丢失,靠黑名单兜底为"操作失败") |
data/system/media.go:125-127 |
九轮,部分修复 |