Qu'est-ce que les Défaillances d'Authentification ?
Les défaillances d'authentification (Authentication and Session Management Failures) concernent les failles permettant aux attaquants de compromettre des identités utilisateur : vols de session, force brute, ou contournement des mécanismes de connexion.
Cette catégorie était précédemment nommée "Broken Authentication" dans l'OWASP Top 10 2017.
Exemples Courants de Failles
- Mots de passe faibles : Absence de politique de complexité.
- Session fixation : Réutilisation d'un ID de session après authentification.
- Tokens prévisibles : Génération de tokens de session non aléatoires.
- Absence de MFA : Authentification à facteur unique uniquement.
- Déconnexion inefficace : Les sessions restent actives après logout.
Comment se protéger ?
Renforcez vos mécanismes d'authentification :
- Mots de passe forts : Exigez une longueur minimale (12+ caractères).
- Multi-Factor Authentication (MFA) : Implémentez TOTP, WebAuthn, ou SMS.
- Gestion sécurisée des sessions : Régénérez l'ID de session après login.
- Protection contre le brute force : Rate limiting et verrouillage de compte.
- Stockage sécurisé : Hachez les mots de passe avec bcrypt, Argon2, ou scrypt.
[!IMPORTANT] Ne stockez jamais les mots de passe en clair. Utilisez toujours un algorithme de hachage lent et salé.
// MAUVAISE PRATIQUE : Hachage faible (MD5, SHA1)
const crypto = require('crypto');
const hash = crypto.createHash('md5').update(password).digest('hex');
// BONNE PRATIQUE : bcrypt avec salt et coût élevé
const bcrypt = require('bcrypt');
const saltRounds = 12;
// Hachage du mot de passe
const hash = await bcrypt.hash(password, saltRounds);
// Vérification du mot de passe
const isValid = await bcrypt.compare(password, hash);Bonnes Pratiques pour les Sessions
// Configuration sécurisée des cookies de session
app.use(session({
secret: process.env.SESSION_SECRET, // Clé forte et aléatoire
resave: false,
saveUninitialized: false,
cookie: {
secure: true, // HTTPS uniquement
httpOnly: true, // Inaccessible au JavaScript
sameSite: 'strict', // Protection CSRF
maxAge: 15 * 60 * 1000 // Expiration après 15 minutes
}
}));
// Régénérer la session après authentification
app.post('/login', (req, res) => {
req.session.regenerate((err) => {
if (err) return next(err);
req.session.userId = user.id;
res.redirect('/dashboard');
});
});