Fehlersicherheit
Regeln
- Stack-Traces, Datenbankfehler oder Dateipfade niemals in der Produktion an Clients weitergeben
- Generische Fehlermeldungen mit einer eindeutigen Fehler-ID zurückgeben:
{ error: "Etwas ist schiefgelaufen", errorId: "abc123" }
- Vollständige Fehlerdetails serverseitig mit derselben Korrelations-ID zu Debugging-Zwecken protokollieren
- Unterschiedliche Fehlerdetailstufen verwenden: Entwicklung (vollständiger Stack-Trace) vs. Produktion (sichere Meldung + ID)
- Alle nicht abgefangenen Fehler mit globalen Fehlerbehandlern abfangen – niemals rohe Fehler an den Client gelangen lassen
- Fehlermeldungen von Drittanbieterdiensten bereinigen, bevor sie an Clients weitergeleitet werden
- Korrekte HTTP-Statuscodes zurückgeben: 400 (fehlerhafte Eingabe), 401 (nicht authentifiziert), 403 (verboten), 404 (nicht gefunden), 500 (Serverfehler)
import { randomUUID } from "node:crypto";
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
const errorId = randomUUID();
console.error({ errorId, message: err.message, stack: err.stack, url: req.url });
const statusCode = (err as any).statusCode || 500;
res.status(statusCode).json({
error: statusCode >= 500 ? "Interner Serverfehler" : err.message,
errorId,
...(process.env.NODE_ENV === "development" && { stack: err.stack }),
});
});
export default function GlobalError({ error, reset }) {
return (
<div>
<h2>Etwas ist schiefgelaufen</h2>
<p>Fehler-ID: {error.digest}</p>
<button onClick={reset}>Erneut versuchen</button>
</div>
);
}
Vermeiden
- Direkte Rückgabe von
err.message – Datenbankfehler geben Tabellennamen, Spaltennamen und Abfragestruktur preis
- Stack-Traces in Produktionsantworten – sie offenbaren Dateipfade, Abhängigkeiten und die interne Architektur
- Ein generischer 500 für alles – verwenden Sie die richtigen Statuscodes, damit Clients Fehler angemessen behandeln können
- Fehler ohne Korrelations-IDs protokollieren – macht das Debuggen in der Produktion nahezu unmöglich
- Fehler stillschweigend schlucken – immer protokollieren, auch wenn die Antwort generisch ist