## 审计重点 - 配置与密钥:敏感信息明文存储在 `configs/*.toml`(数据库密码、JWT密钥、COS密钥、微信AppSecret、commit_master_key)。 - 路由与鉴权:管理端多数接口已启用 `AdminTokenAuthVerify`;但存在非鉴权管理端接口(如 `seed_default`、`ensure_titles`)。 - 特效参数:`SystemTitleEffects.ParamsJSON` 后端仅做“非空”校验,运行期解析失败静默忽略;缺少数值范围与集合规模约束。 - 抽奖随机性:主密钥未打印日志;HMAC与拒绝采样实现合理;但密钥来源为明文配置文件,需迁移至环境变量。 - 优惠券/道具卡:分配/发放缺少配额与上限控制、幂等与审计;优惠券发放未限制超管。 ## 具体风险与代码位置 - 明文密钥:`configs/fat_configs.toml:32`、`configs/*_configs.toml` 多处(JWT/COS/MySQL/Wechat/commit_master_key)。 - 管理端非鉴权路由:`internal/router/router.go`(`/api/admin/system_titles/seed_default`、`/api/admin/menu/ensure_titles`)。 - 特效参数缺失校验:`internal/api/admin/titles_admin.go:173-213, 225-260`(仅非空);运行期解析:`internal/service/activity/draw_with_effects.go:104-149`(失败忽略)。 - 优惠券发放权限与配额:`internal/api/admin/users_admin.go::AddUserCoupon`(无超管校验、无模板配额扣减);道具卡分配虽限超管,但无上限/审计:`internal/api/admin/item_cards_admin.go::AssignUserItemCard`。 ## 修复方案(分阶段) 1) 配置与密钥治理 - 将敏感配置迁移到环境变量;`configs/*.toml`改为占位与示例;确保不在日志输出敏感值。 - 在密钥读取处加入检测:若为空或默认值,拒绝启动并记录安全告警。 2) 鉴权与权限 - 将所有管理端变更型接口统一置于鉴权组;保留非鉴权的仅限登录与必要的只读接口。 - 优惠券发放接口增加超管校验或细粒度权限;引入操作审计(记录操作者、时间、对象、数量)。 3) 特效参数强校验 - 后端在 `Create/ModifySystemTitleEffect` 按 `effect_type` 反序列化到明确 struct,启用 `DisallowUnknownFields`; - 数值边界:`boost_x1000/chance_x1000/cap_x1000` 禁止负数,限制最大值;`target_prize_ids` 长度限制与去重; - 运行期解析失败不再静默:记录结构化告警日志,并在管理端提示配置异常。 4) 优惠券/道具卡防滥用 - 模板配额与上限:发放时扣减可用数量,事务内完成;超量拒绝。 - 用户持有上限与重复发放策略:同模板在时间窗口内单用户限制;引入幂等键防重复请求。 - 操作审计与限流:关键接口限流、审批或二次确认;记录审计日志。 5) 抽奖安全稳健 - 保持现有 HMAC 与拒绝采样;确保 `commit_master_key` 仅从安全环境加载;周期性轮换与版本化控制。 ## 交付内容 - 安全问题清单(带文件与行号)。 - 修复清单与实施顺序(先密钥与鉴权→后特效参数校验→最后配额/审计/限流)。 - 修复后的验证方案:单元测试、接口防护测试、管理端提示验证。 如确认,我将按上述方案逐项实施修复并提交相应代码与测试。