# 重点安全复查 2026-10-21 ## 本轮修复:支付商户管理 1. /manage/shop CRUD 原无细分权限,现在分别 merchant:view/add/edit/delete;限单配置、税率配置及渠道商户切换受对应权限保护。 2. 商户列表原直接序列化实体,包含 appPrivateKey、secret。现在响应移除两字段;仅保留类型及分页白名单,避免利用通用查询参数筛选秘密字段。 3. 编辑密钥不回显旧值,留空保留原值;前端编辑不强制填写新密钥。商户类型和appId不允许原地修改,避免错配已有支付路由;更换时新增商户并明确迁移。 4. sys_default_shop_key 经通用 /sys/get/post/update/delete 操作时,服务端根据真实配置key校验商户权限,不能通过配置ID绕过。 5. 新增商户拒绝传入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不可绕过权限。无生产写入、无真实退款。