Retour au blog
Sécurité8 min

OWASP A01:2021 – Contrôle d'accès défaillant

Comprendre et prévenir les failles de contrôle d'accès, la menace numéro 1 du Web moderne.

Équipe Eurinhash

Analyste en Cybersécurité

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

  1. Violation du principe du moindre privilège : Un utilisateur standard accède à une interface d'administration.
  2. IDOR (Insecure Direct Object Reference) : Modifier un paramètre dans l'URL (ex: ?id=123 en ?id=124) pour voir les données d'un autre utilisateur.
  3. É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);
  });
});

Restez en veille

Inscrivez-vous pour recevoir nos prochaines analyses techniques directement dans votre terminal.