根因:线上 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 用例全绿)
45 行
2.1 KiB
TypeScript
45 行
2.1 KiB
TypeScript
// 已读取AGENTS.md
|
||
import * as fs from 'fs';
|
||
import * as path from 'path';
|
||
|
||
/**
|
||
* 第八十七批:危险兜底默认关闭(secure by default)。
|
||
* 背景:线上 NODE_ENV 未设为 production 时,
|
||
* - resolveSecureUserId 会信任客户端声明的 userId(任意身份伪造)
|
||
* - ALLOW_SANDBOX_PAY 为 true(无真实收款即可推进订单)
|
||
* - GET /api/users/:id 会按"本人"返回余额/佣金/手机号
|
||
* 修复:以上兜底全部改为必须显式开启 ALLOW_INSECURE_DEV_AUTH=1 / ALLOW_SANDBOX_PAY=1。
|
||
*/
|
||
describe('第八十七批危险兜底默认关闭闸门', () => {
|
||
const root = path.resolve(__dirname, '../../');
|
||
const indexCode = fs.readFileSync(path.join(root, 'server/src/index.ts'), 'utf-8');
|
||
const doc = fs.readFileSync(path.join(root, 'docs/部署验收与1分钱支付闭环.md'), 'utf-8');
|
||
|
||
it('身份兜底需显式开启(生产或未开启均 401)', () => {
|
||
expect(indexCode).toContain("const ALLOW_INSECURE_DEV_AUTH = process.env.ALLOW_INSECURE_DEV_AUTH === '1';");
|
||
expect(indexCode).toContain('if (IS_PRODUCTION || !ALLOW_INSECURE_DEV_AUTH)');
|
||
});
|
||
|
||
it('沙箱支付必须显式开启(不再按 NODE_ENV 自动放行)', () => {
|
||
expect(indexCode).toContain("const ALLOW_SANDBOX_PAY = process.env.ALLOW_SANDBOX_PAY === '1';");
|
||
expect(indexCode).not.toContain("process.env.ALLOW_SANDBOX_PAY === '1' || !IS_PRODUCTION");
|
||
});
|
||
|
||
it('用户资料/大神资料的"本人视角"兜底同样需显式开启', () => {
|
||
const matches = indexCode.match(/if \(!IS_PRODUCTION && ALLOW_INSECURE_DEV_AUTH\)/g) || [];
|
||
expect(matches.length).toBeGreaterThanOrEqual(2);
|
||
});
|
||
|
||
it('启动自检提示危险开关状态', () => {
|
||
expect(indexCode).toContain('已开启 ALLOW_INSECURE_DEV_AUTH=1');
|
||
expect(indexCode).toContain('已开启 ALLOW_SANDBOX_PAY=1');
|
||
expect(indexCode).toContain('ALLOW_INSECURE_DEV_AUTH=${ALLOW_INSECURE_DEV_AUTH}');
|
||
});
|
||
|
||
it('部署文档说明这两个危险开关默认关闭', () => {
|
||
expect(doc).toContain('ALLOW_INSECURE_DEV_AUTH=1');
|
||
expect(doc).toContain('ALLOW_SANDBOX_PAY=1');
|
||
expect(doc).toContain('生产环境绝对不要开启');
|
||
});
|
||
});
|