Qu'est-ce que le Contrôle d'Accès Défaillant ?
Le contrôle d'accès est le mécanisme qui garantit que les utilisateurs ne peuvent pas agir en dehors de leurs autorisations prévues. Une défaillance à ce niveau se produit lorsque les utilisateurs peuvent accéder à des ressources ou effectuer des actions en dehors de leur périmètre normal.
Dans le classement OWASP Top 10 2021, cette catégorie est passée de la 5ème à la 1ère place, soulignant son importance critique.
Exemples Courants de Failles
- Violation du principe du moindre privilège : Un utilisateur standard accède à une interface d'administration.
- IDOR (Insecure Direct Object Reference) : Modifier un paramètre dans l'URL (ex:
?id=123en?id=124) pour voir les données d'un autre utilisateur. - Élévation de privilèges : Un utilisateur change son propre rôle en "admin" via une requête malveillante.
Comment se protéger ?
Pour bâtir des applications robustes, suivez ces règles d'or :
- Refus par défaut : Tout ce qui n'est pas explicitement autorisé doit être interdit.
- Contrôles côté serveur : Ne faites jamais confiance aux vérifications effectuées uniquement côté client (JavaScript).
- Centralisation : Utilisez un module unique et testé pour gérer toutes les politiques d'accès.
- Journalisation : Enregistrez les tentatives de violation du contrôle d'accès pour détecter les attaques en cours.
[!IMPORTANT] Le contrôle d'accès doit être appliqué à chaque point de terminaison (API, navigation, boutons). Un simple lien caché n'est pas une sécurité.
// MAUVAISE PRATIQUE : Faire confiance à l'ID fourni par le client
app.get('/api/user/data', (req, res) => {
const userId = req.query.id; // L'attaquant peut changer cet ID
db.query(`SELECT * FROM users WHERE id = ${userId}`, (err, data) => {
res.json(data);
});
});
// BONNE PRATIQUE : Utiliser l'ID de la session sécurisée
app.get('/api/user/data', (req, res) => {
const userId = req.session.userId; // ID vérifié via authentification
db.query('SELECT * FROM users WHERE id = ?', [userId], (err, data) => {
res.json(data);
});
});