重点安全复查 2026-10-21
本轮修复:支付商户管理
- /manage/shop CRUD 原无细分权限,现在分别 merchant:view/add/edit/delete;限单配置、税率配置及渠道商户切换受对应权限保护。
- 商户列表原直接序列化实体,包含 appPrivateKey、secret。现在响应移除两字段;仅保留类型及分页白名单,避免利用通用查询参数筛选秘密字段。
- 编辑密钥不回显旧值,留空保留原值;前端编辑不强制填写新密钥。商户类型和appId不允许原地修改,避免错配已有支付路由;更换时新增商户并明确迁移。
- sys_default_shop_key 经通用 /sys/get/post/update/delete 操作时,服务端根据真实配置key校验商户权限,不能通过配置ID绕过。
- 新增商户拒绝传入ID,系统时间由服务端控制。
上线
执行 docs/sql/20261021-merchant-permissions.sql,填写商户菜单父ID,确认五行OK。其他角色显式授权,商户下拉选项的合法使用者也需要merchant:view。默认只有root获得新增权限。
原12权限 + 退款2 + 商户5 = 19个权限项(merchant:updateChannelShop可能已存在,不重复插入)。尚未执行生产SQL或部署。
编辑密钥不会清空旧值,无“删除密钥”接口;创建商户必须填写对应密钥。商户删除仍需人工核查订单/渠道关联,本轮没有重构商户生命周期。
仍需继续处理,不能宣称全修完
- 加余额目前只有并发余额条件更新和前端防连点,没有持久业务幂等键,超时重试/多端重复提交可能重复加款。
- 部分退款使用短时Redis锁,不等同于支付渠道/数据库完整幂等;需要专门在测试库验证超时、并发和回调重放。
- 历史已泄漏券码、私钥及异常优惠券不会随部署自动失效,需核查访问日志、异常数据并视情况轮换商户密钥。
- 优惠券领取并发、兑换码消费原子性及其他后台旁路接口仍需完整动态验收,前端构建和权限注解检查不能证明这些安全。
- 本轮不评估其他前台商品商店 /manage/shop/get/goods 等业务;它们与支付商户共用路径前缀,未盲目添加错误权限。
验收
测试库验证匿名/普通后台/仅查询/编辑/停用账号;检查商户列表响应不含密钥明文、空密钥编辑保留原值、通用配置ID不可绕过权限。无生产写入、无真实退款。