修复 API 500 响应泄露内部错误细节
This commit is contained in:
@@ -68,7 +68,12 @@
|
|||||||
- 至少要求登录态;更稳妥是同时校验房间成员身份(若与房间上下文绑定);
|
- 至少要求登录态;更稳妥是同时校验房间成员身份(若与房间上下文绑定);
|
||||||
- 配合限流(IP + 用户维度)。
|
- 配合限流(IP + 用户维度)。
|
||||||
|
|
||||||
### P1-2 API 错误响应直接回传内部异常细节(信息泄露)
|
### P1-2 API 错误响应直接回传内部异常细节(信息泄露)【已完成】
|
||||||
|
- 修复状态:✅ 已完成(2026-03-03)
|
||||||
|
- 修复内容:
|
||||||
|
- `apiHandler` 对未知异常返回统一文案 `操作失败,请稍后重试`;
|
||||||
|
- 内部异常细节仅保留在服务端日志;
|
||||||
|
- 更新对应单元测试断言。
|
||||||
- 证据:
|
- 证据:
|
||||||
- `src/lib/api.ts:63-65`(500 响应包含 `ErrorName: message`)
|
- `src/lib/api.ts:63-65`(500 响应包含 `ErrorName: message`)
|
||||||
- 影响:
|
- 影响:
|
||||||
|
|||||||
+1
-1
@@ -98,7 +98,7 @@ describe("apiHandler", () => {
|
|||||||
const res = await handler(req, mockCtx);
|
const res = await handler(req, mockCtx);
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
expect(res.status).toBe(500);
|
expect(res.status).toBe(500);
|
||||||
expect(data.error).toBe("操作失败 [Error: unexpected]");
|
expect(data.error).toBe("操作失败,请稍后重试");
|
||||||
consoleSpy.mockRestore();
|
consoleSpy.mockRestore();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
+4
-2
@@ -60,9 +60,11 @@ export function apiHandler(handler: RouteHandler): RouteHandler {
|
|||||||
{ status: 409 },
|
{ status: 409 },
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
const detail = e instanceof Error ? `${e.name}: ${e.message}` : String(e);
|
|
||||||
console.error(`[API ${req.method} ${req.nextUrl.pathname}]`, e);
|
console.error(`[API ${req.method} ${req.nextUrl.pathname}]`, e);
|
||||||
return NextResponse.json({ error: `操作失败 [${detail}]` }, { status: 500 });
|
return NextResponse.json(
|
||||||
|
{ error: "操作失败,请稍后重试" },
|
||||||
|
{ status: 500 },
|
||||||
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user