security(errors): 5xx без утечки err.message клиенту
Шаг 0.7 плана production-готовности: - глобальный error handler: нейтральный текст + код инцидента, детали в лог - route-уровень: зачистка err.message/String(err) в 5xx по 12 файлам, оригинальные ошибки логируются с контекстом
This commit is contained in:
@@ -1075,16 +1075,20 @@ async function runStartupDataPatches() {
|
||||
|
||||
app.use((err: any, _req: Request, res: Response, _next: NextFunction) => {
|
||||
const status = err.status || err.statusCode || 500;
|
||||
const message = err.message || "Internal Server Error";
|
||||
|
||||
if (res.headersSent) {
|
||||
console.error('[express] Error after headers sent:', err);
|
||||
return;
|
||||
}
|
||||
res.status(status).json({ message });
|
||||
if (status >= 500) {
|
||||
console.error('[express] Server error:', err);
|
||||
// Клиенту — только нейтральный текст и id инцидента; детали (SQL, стек) — в серверный лог
|
||||
const requestId = crypto.randomUUID().slice(0, 8);
|
||||
console.error(`[express] Server error [${requestId}]:`, err);
|
||||
res.status(status).json({ message: `Внутренняя ошибка сервера (код ${requestId})` });
|
||||
return;
|
||||
}
|
||||
const message = err.message || "Bad Request";
|
||||
res.status(status).json({ message });
|
||||
});
|
||||
|
||||
// importantly only setup vite in development and after
|
||||
|
||||
Reference in New Issue
Block a user