Skip to content

安全漏洞修复: 支付越权/密码存储/CORS/事务保护/参数校验#25

Open
phpmac wants to merge 7 commits into
newbee-ltd:mainfrom
phpmac:fix/security-pr-upstream
Open

安全漏洞修复: 支付越权/密码存储/CORS/事务保护/参数校验#25
phpmac wants to merge 7 commits into
newbee-ltd:mainfrom
phpmac:fix/security-pr-upstream

Conversation

@phpmac
Copy link
Copy Markdown

@phpmac phpmac commented May 20, 2026

概述

对 newbee-mall-api-go 进行安全审计后发现的漏洞修复, 涉及 Critical/High/Medium 三个级别共 7 个问题.

关联 Issue: #24


修复内容

C3 [Critical] 支付接口越权操作

  • service/mall/mall_order.go PaySuccess/FinishOrder/CancelOrder/GetOrderDetail 方法添加 userId 归属校验
  • api/v1/mall/mall_order.go 从请求头获取 token 传入 service 层
  • 修复前: 只要知道 orderNo 就能操作任何人的订单(包括标记已支付)

H1 [High] 密码无盐MD5存储

  • utils/md5.go 注册时使用 bcrypt 哈希存储密码
  • 登录时先 MD5 再 bcrypt 对比, 兼容前端 MD5 传输方式
  • 已有用户密码保持兼容, 新注册用户使用 bcrypt

H2 [High] CORS 反射任意 Origin

  • middleware/cors.go 改为配置化白名单
  • 新增 config/cors.goconfig.yaml 中的 cors.allow-origins 配置项
  • 默认允许 localhost 前端开发地址

H4 [High] 订单创建无事务保护

  • service/mall/mall_order.go SaveOrder 使用 GORM Transaction 包裹全部操作
  • 购物车软删除添加 AND is_deleted = 0 条件防止并发重复消费
  • 库存扣减使用原子 SQL stock_num = stock_num - ? WHERE stock_num >= ?

M1 [Medium] 参数验证失败后缺少 return

  • api/v1/mall/mall_order.go Verify 失败后添加 return, 防止代码继续执行

M2 [Medium] ShouldBindJSON 错误被忽略

  • api/v1/mall/mall_order.go 不再使用 _ = 忽略绑定错误

C1/C2 管理后台接口权限

  • 商品管理和配置管理路由添加 JWT 认证中间件

测试

包含自动化测试验证所有修复:

  • test/c1_c2_auth_fixed_test.go - 验证管理接口需要认证
  • test/c3_pay_fixed_test.go - 验证支付操作需要订单归属
  • test/h1_h2_h4_m1_m2_fixed_test.go - 验证 bcrypt/CORS/事务/参数校验

测试计划

  • 启动服务, 注册新用户, 验证 bcrypt 密码存储
  • 用其他用户 token 调用 PaySuccess, 验证返回权限错误
  • 发送恶意 Origin 请求, 验证 CORS 不反射
  • 并发下单同一商品, 验证只有一个成功
  • 发送非法 JSON 请求, 验证返回错误

mastepperhs and others added 7 commits May 20, 2026 08:51
- 多阶段 Dockerfile 构建 (Go 1.17 builder + Alpine runtime)
- docker-compose.yml 集成 MySQL 8.0, 含健康检查依赖
- config.docker.yaml 容器环境配置 (静默日志模式)
- docker-entrypoint.sh 数据库表为空时自动导入 schema
- .dockerignore 排除构建无关文件
- config.yaml 数据库名统一为 mall
含8类漏洞验证(C1-C3/H1-H4/M1-M2), 涵盖认证缺失/支付绕过/
密码学弱点/CORS配置错误/竞态条件/输入校验等问题.
测试通过标准: 漏洞存在=测试通过.
漏洞详情文档位于 docs/todo.md.
- C1+C2: 后台商品管理和首页配置路由组添加 AdminJWTAuth 中间件
- C3: PaySuccess/FinishOrder/CancelOrder 添加 token 参数和订单归属校验
- H1: 密码存储从 MD5 升级为 bcrypt, 兼容旧 MD5 自动升级
- H2: CORS 从反射任意 Origin 改为白名单模式
- H4: SaveOrder 添加数据库事务保护, 软删除购物项加 is_deleted=0 防并发
- M1: SaveOrder/FinishOrder/CancelOrder 验证失败后补 return
- M2: ShouldBindJSON 错误检查补全, MallOrderAddress 补 TableName
删除断言"漏洞存在"的测试文件, 保留断言"漏洞已修复"的测试
同时补充 config.yaml 的 CORS 白名单配置
包含以下安全修复:
- C3 [Critical]: 支付/订单操作添加用户归属校验, 防止越权操作
- H1 [High]: 密码存储从无盐MD5升级为bcrypt
- H2 [High]: CORS从反射任意Origin改为配置化白名单
- H4 [High]: 订单创建添加事务保护和并发安全控制
- M1 [Medium]: 参数验证失败后添加return, 防止代码继续执行
- M2 [Medium]: ShouldBindJSON错误不再被忽略
- C1/C2: 管理后台接口添加JWT认证中间件

同时将 module path 还原为官方 main.go 以兼容上游仓库
@phpmac phpmac changed the title Fix/security pr upstream 安全漏洞修复: 支付越权/密码存储/CORS/事务保护/参数校验 May 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants