Sécurité des erreurs
Règles
- Ne jamais divulguer de stack traces, d'erreurs de base de données ou de chemins de fichiers aux clients en production
- Renvoyer des messages d'erreur génériques avec un identifiant d'erreur unique :
{ error: "Quelque chose s'est mal passé", errorId: "abc123" }
- Enregistrer tous les détails de l'erreur côté serveur avec le même identifiant de corrélation pour le débogage
- Utiliser différents niveaux de détail des erreurs : développement (stack trace complet) vs production (message sécurisé + ID)
- Attraper toutes les erreurs non gérées avec des gestionnaires d'erreurs globaux — ne jamais laisser les erreurs brutes atteindre le client
- Nettoyer les messages d'erreur provenant de services tiers avant de les transmettre aux clients
- Renvoyer des codes de statut HTTP appropriés : 400 (mauvaise entrée), 401 (non authentifié), 403 (interdit), 404 (non trouvé), 500 (erreur serveur)
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 ? "Erreur interne du serveur" : err.message,
errorId,
...(process.env.NODE_ENV === "development" && { stack: err.stack }),
});
});
export default function GlobalError({ error, reset }) {
return (
<div>
<h2>Quelque chose s'est mal passé</h2>
<p>Identifiant d'erreur : {error.digest}</p>
<button onClick={reset}>Réessayer</button>
</div>
);
}
À éviter
- Renvoyer
err.message directement — les erreurs de base de données divulguent les noms de tables, les noms de colonnes et la structure des requêtes
- Les stack traces dans les réponses de production — elles révèlent les chemins de fichiers, les dépendances et l'architecture interne
- Un 500 générique pour tout — utilisez les codes de statut appropriés pour que les clients puissent gérer les erreurs correctement
- Enregistrer les erreurs sans identifiants de corrélation — rend le débogage en production presque impossible
- Avaler les erreurs en silence — enregistrez toujours, même si la réponse est générique