11 KiB
11 KiB
代码审查问题清单(internal + pkg)
- 审查日期:2026-08-27 ~ 2026-08-28,共五轮全量审查。第五轮(2026-08-28):核查第四至七轮全部处置声称(W/S/P/F/C/L/D 系列已修复与评估保留项)+ 全新视角回归审查;
go build ./...编译验证通过 - 文档结构:只保留待修复问题,按类型归类(不按轮次);每条标注发现轮次;已修复并经复查确认的、以及经评估决定保留的直接删除
- gva/ 目录是遗留参考库(独立 module 不参与 kra 编译),不在审查范围
- 依赖方向合规确认:pkg 无 import internal;integration 不 import data/service;data 不 import integration/payment;无循环依赖
- 第五轮总评:核心业务路径(支付/调度/数据权限/上传)逻辑严谨、分层契约执行到位;历轮修复全部属实;当前债务已收敛为敏感数据落地防护不对称、文档漂移、中转微文件三类
一、安全与正确性缺陷(第五轮新发现,最优先)
| # | 问题 | 位置 | 说明 |
|---|---|---|---|
configs/config.yaml 中的 MySQL DSN、数据库密码和 JWT signing key;模板仅保留 KRA_* 环境变量覆盖说明。泄漏值仍存在于历史提交,需在部署侧轮换数据库密码与 JWT 密钥。 |
|||
redactJSON,与访问日志保持同一脱敏和长度上限策略,避免 token/密钥字段明文入库。 |
|||
key、public_cert、signing_key、secret_key 等敏感键,并将 integration payment test 路由标记为 BodyPolicyPaymentConfig,请求体统一使用摘要策略。 |
|||
reloadSystem 才重建数据库/缓存/存储/集成客户端;保留双路径以维护回滚与连接退休安全。 |
|||
err.Error() 拼接;客户端只收到稳定分类提示,内部错误仍由审计/日志链路保留。 |
|||
Size、MD5、Mime、UserID 字段,保持与完整上传记录一致。 |
|||
CompleteUploadSession 失败时现在回退会话状态并返回错误,避免 media 已创建而 session 长期停留 merging;非关键分片清理仍保持 best-effort。 |
|||
deleted_at IS NULL 与 Model scope 叠加属于迁移期防御,并新增参数软删除更新回归测试。 |
|||
!accepted 的不可达兜底,统一返回已确认的 providerErr。 |
二、死代码残留(第五轮新扫描)
| 死代码 | 位置 | 证据 |
|---|---|---|
NewPaymentUsecase。 |
||
MergeIntegrationDefaults。 |
||
convertAuthority 的 DeletedAt 值传递被 json:"-" 丢弃 |
三、重复实现残留(历轮收敛后的漏网项)
| # | 问题 | 位置 | 轮次 |
|---|---|---|---|
paymentkit.NormalizePaymentMethod,消除点号/短横线/空格处理漂移。 |
|||
paymentOrderFingerprint 完成 BeforeCreate 前后不可变校验,保留同等字段覆盖范围并删除 10 个 canonical 局部变量。 |
|||
BodyPolicyUpload 并让 AccessLog 按 routecatalog 决定上传请求体限额,删除硬编码 URL 后缀判断。 |
四、文档漂移(第五轮新发现,低成本高收益)
| # | 问题 | 位置 |
|---|---|---|
internal/paymentkit。 |
||
docs/。 |
五、过分拆分残留(微文件清单,行数实测)
| 文件 | 行数 | 说明 |
|---|---|---|
Database seam 被多个 data 子包独立依赖。 |
||
注:Wire ProviderSet 微文件(约 10 个 ≤9 行)属 Wire 惯例不计债务;biz/system 微文件群、SystemConfigService、provider/providers 双文件等已在历轮合并完成。
审查后认为合理、不建议改动的部分(历轮评估保留决策汇总)
- biz 注入面:RegisterBusinessModule/PaymentBusinessModule 是 docs/PAYMENT.md:121-129 明文声明的业务接入契约(模板无生产实现属预期);PayInternal/RefundInternal/AuthorizeRefund 被 biz 调用链消费
- F-2/F-4/F-6/F-7/F-9/F-10/F-11:result.go 自有协议语义非纯转发;handler/http.go 别名层;task 双 usecase 生命周期不同;initialize 三层是启动编排倒置链;system usecase 壳是 Wire 契约边界;security_session 剩余 6 方法跨三层消费;biz 接口嵌入是组合窄能力
- S-5/S-6/S-7/S-8/S-9:payment 大文件承载跨供应商编排;dto 跨域文件移动放大契约变化;data 转换命名差异需全域迁移;media 四文件职责边界清晰;单方法 handler 由 Wire 注入约束
- D-4/D-6/D-9/D-10/D-11/D-19:handler 样板各域差异明显;mq helper 属排除范围;config/runtimeconfig 分离已补决策注释;三处清理入口不同各自独立触发;树算法输入模型不同;金额守恒四处输入形态互异(完整结构体/配置化 JSON/XML 值映射/SDK 结构体)
- L-5/L-10/L-12:错误审计白名单被测试锁定;Kratos errors 仅跨层/stdlib 管内部的双体系分层;binding 覆盖结构必填、手工覆盖上下文(覆盖不均但新代码倾向 binding,未恶化)
- P-3/P-5/P-6/P-7/P-8/P-9/P-10/P-11/P-13:pkg 各包定位经复核成立;mq/websocket 属既定排除
- X-1~X-4/X-6~X-8/X-10/X-11:路由双声明/集成配置双通道/热重载分工(watchLoop 发布快照 vs reloadConfig 重建基础设施,合并需重做锁与退休策略)等均完成影响分析保留
- C-2/C-4/C-6/C-8:loadUser/loadUsers 查询策略不同;*Data nil 防御覆盖测试替身边界;媒体三重限制各守一层;PaymentLogger 是审计替换 seam
- L-7 复核:data 层 Table() 已全 PO 化(仅 2 处导出动态表名合理保留);saveRelations 只做 DO→PO 转换
- 质量标杆(第五轮正面确认):payment 幂等指纹+回调强制平台查单、退款 lease 语义、task_scheduler 锁序、task_executor SSRF 拨号防护+orphan 跟踪、auth singleflight(context.WithoutCancel 隔离取消传染)、data_scope 回调注入、email CRLF 清洗、ListTasks(0,0) 全量语义、新增缝(PaymentAdapterFactory/MergeRuntimeConfig/deletePrefixViaList/AST 缓存/systeminfo)均内聚无越界
处置建议(按优先级)
- 立即处理 V-1(泄漏的数据库密码)→ V-2/V-3(审计敏感数据落地防护对称化)
- V-4/V-9(热重载漂移文档化、软删语义逐项确认+补测试)
- V-5/V-6/V-7/V-8/V-10 + 二节死代码(小而具体的清理批次)
- 三节 D-2 三处遗漏 + D-31/D-32
- 四节文档漂移群(一次 README/CLAUDE.md 同步批)
- 五节微文件合并(最后)