security: 危险兜底默认关闭(secure by default)——修复 NODE_ENV 未设导致的身份伪造/沙箱支付/隐私泄露
根因:线上 NODE_ENV 未设为 production 时,以下"开发兜底"全部自动生效: - resolveSecureUserId 信任客户端声明的 userId → 任意用户身份伪造 - ALLOW_SANDBOX_PAY = ... || !IS_PRODUCTION → 无真实收款即可推进订单(资损) - GET /api/users/:id 按"本人"返回余额/佣金/手机号 → 隐私泄露 修复(兜底改为必须显式开启): - 新增 ALLOW_INSECURE_DEV_AUTH(默认 false);resolveSecureUserId 改为 `if (IS_PRODUCTION || !ALLOW_INSECURE_DEV_AUTH) 401` - ALLOW_SANDBOX_PAY 改为仅 `process.env.ALLOW_SANDBOX_PAY === '1'` - assertCompanionActor 与用户资料"本人视角"兜底加 ALLOW_INSECURE_DEV_AUTH 限制 - /api/health 新增 mode 与 sandboxPayAllowed;启动自检打印两个危险开关并告警 - 文档补充危险开关说明(生产禁止开启) 验证:本地模拟 NODE_ENV 未设 → 通知/订单/下单 均 401、用户资料不泄露隐私、沙箱支付关闭; 开启 ALLOW_INSECURE_DEV_AUTH=1 后联调能力保留;production 模式行为一致。(冒烟 13/13) 新增 secure-default-auth.spec.ts(103 套件/696 用例全绿)
这个提交包含在:
@@ -40,6 +40,10 @@ MYSQL_DATABASE=peiwan
|
||||
# WX_APP_ID=wx****************
|
||||
# WX_APP_SECRET=<32位小程序 AppSecret>
|
||||
|
||||
# ⚠️ 危险开关:默认关闭,生产环境绝对不要开启
|
||||
# ALLOW_INSECURE_DEV_AUTH=1 # 仅本地联调:未登录请求允许使用客户端声明的 userId(开启后任何人可伪造身份)
|
||||
# ALLOW_SANDBOX_PAY=1 # 仅联调:允许沙箱支付(无真实收款即可推进订单)
|
||||
|
||||
# 可选:微信(若已在后台"微信支付配置"页填写,则无需在这里重复;后台配置优先)
|
||||
# WX_APP_ID=...
|
||||
# WX_APP_SECRET=...
|
||||
|
||||
在新工单中引用
屏蔽一个用户