Rappel théorique
Le contrôle d'accès brisé regroupe toutes les situations où une application authentifie correctement un utilisateur, mais ne vérifie pas (ou mal) que cet utilisateur a réellement le droit d'accéder à la ressource ou à l'action demandée. C'est l'une des catégories les plus fréquentes du Top 10 OWASP : il suffit souvent de modifier un identifiant dans une URL ou un formulaire pour accéder aux données d'un autre utilisateur, voire à des fonctions réservées aux administrateurs.
Deux formes principales
| Type | Description | Exemple |
|---|---|---|
| Élévation horizontale (IDOR - Insecure Direct Object Reference) |
Un utilisateur accède aux données d'un autre utilisateur de même niveau en changeant un identifiant référencé directement (souvent un entier auto-incrémenté). | profil.php?id=1001 → profil.php?id=2001 pour lire
la commande d'un autre client. |
| Élévation verticale | Un utilisateur accède à des fonctionnalités réservées à un rôle supérieur (administrateur) sans que son rôle ne soit vérifié côté serveur. | profil.php?admin=1 affiche un panneau d'administration à n'importe
quel utilisateur connecté. |
Causes principales
- Vérification d'autorisation absente ou faite uniquement côté client (JavaScript, masquage de bouton...).
- Références directes à des objets (identifiants de base de données séquentiels) exposées dans l'URL sans contrôle de propriété.
- Décisions de contrôle d'accès basées sur des paramètres modifiables par
l'utilisateur (
role,adminen GET/POST/cookie). - Absence de politique "deny by default" : tout est autorisé sauf ce qui est explicitement interdit.
Mesures de protection
- Toujours vérifier côté serveur que l'utilisateur authentifié est
propriétaire de la ressource demandée (
WHERE ... AND utilisateur_id = :uid). - Ne jamais faire confiance à un paramètre client pour déterminer un rôle ou un droit.
- Appliquer le principe du moindre privilège et un modèle "deny by default".
- Centraliser les contrôles d'autorisation (middleware, couche d'accès aux données) plutôt que de les dupliquer dans chaque page.
- Journaliser et superviser les accès refusés (tentatives d'IDOR, d'accès admin).
Démo vulnérable
Un espace "Mes commandes" qui permet de consulter le détail d'une commande par son identifiant, et un lien vers un "espace administrateur" - sans aucune vérification de propriété ni de rôle.
Démo sécurisée
Même interface, mais la commande doit appartenir à l'utilisateur connecté
(AND utilisateur_id = :uid) et l'espace administrateur vérifie le rôle
en session.