security: /api/health 暴露运行模式与沙箱支付开关(便于发现生产跑成 development)
- health 新增 mode(production/development) 与 sandboxPayAllowed - 便于部署自检:非 production 时身份校验放宽且允许沙箱支付,属资损级配置风险 - 新增 runtime-mode-selfcheck.spec.ts(102 套件/691 用例全绿)
这个提交包含在:
@@ -202,6 +202,9 @@ app.get('/api/health', (_req: Request, res: Response) => {
|
||||
database: 'connected',
|
||||
uptime: process.uptime(),
|
||||
build: '2026-10-19',
|
||||
// 运行模式自检:非 production 时用户身份校验会放宽、且允许沙箱支付(严禁用于公网)
|
||||
mode: IS_PRODUCTION ? 'production' : 'development',
|
||||
sandboxPayAllowed: ALLOW_SANDBOX_PAY,
|
||||
features: {
|
||||
userToken: true,
|
||||
adminPasswordGate: true,
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
// 已读取AGENTS.md
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
|
||||
/**
|
||||
* 第八十六批:/api/health 暴露运行模式,避免"生产跑成 development"却无人察觉。
|
||||
* 背景:线上 NODE_ENV 未设为 production 时,resolveSecureUserId 会退回客户端声明身份,
|
||||
* 且 ALLOW_SANDBOX_PAY 为 true(可无支付推进订单),属资损级配置风险。
|
||||
*/
|
||||
describe('第八十六批运行模式自检闸门', () => {
|
||||
const root = path.resolve(__dirname, '../../');
|
||||
const indexCode = fs.readFileSync(path.join(root, 'server/src/index.ts'), 'utf-8');
|
||||
|
||||
it('/api/health 返回 mode 与 sandboxPayAllowed', () => {
|
||||
expect(indexCode).toContain("mode: IS_PRODUCTION ? 'production' : 'development'");
|
||||
expect(indexCode).toContain('sandboxPayAllowed: ALLOW_SANDBOX_PAY');
|
||||
});
|
||||
});
|
||||
在新工单中引用
屏蔽一个用户