Autorisation et contrôle d'accès
L'authentification prouve qui vous êtes. L'autorisation décide ce que vous avez le droit de toucher. La faille la plus courante et la plus dommageable des applications modernes consiste à mal gérer la seconde : un utilisateur connecté lit ou modifie des données qui ne lui appartiennent pas.
Liste de contrôle
- Vérifiez la propriété à chaque accès à un objet. Pour chaque route qui reçoit un identifiant (une facture, une note, un projet, un message), confirmez que l'utilisateur courant possède ou peut accéder à cet enregistrement précis avant de le renvoyer ou de le modifier. C'est ce qu'on appelle Broken Object Level Authorization (BOLA), aussi appelé IDOR, et c'est le risque numéro un de l'OWASP.
- Filtrez par propriétaire, pas seulement par identifiant. Une requête comme
SELECT * FROM invoices WHERE id = ?constitue un IDOR. Écrivez plutôtWHERE id = ? AND owner_id = ?et renvoyez 404 si rien ne correspond. - Ne comptez pas sur le client pour masquer des éléments. Un bouton caché ou un lien absent n'est pas un contrôle d'accès. La vérification doit se faire côté serveur.
- Conservez les contrôles d'autorisation lors des refactorisations. Les vérifications d'accès ajoutées dans une modification sont souvent supprimées dans la suivante. Retestez la propriété après chaque changement sur les routes de données.
- Appliquez la sécurité au niveau des lignes dans la base de données lorsque votre plateforme le permet, afin qu'un contrôle oublié dans le code soit tout de même bloqué par la couche de données.
- Protégez chaque route d'administration et interne. Vérifiez que l'appelant est réellement administrateur, à partir d'une source de confiance (un rôle côté serveur, pas un champ que l'utilisateur peut modifier), et rendez les routes internes inaccessibles depuis Internet public.
- Isolez les locataires. Dans une application multi-locataires, chaque requête et chaque chemin de fichier doit être limité au locataire de l'appelant via un point de passage unique, pour qu'un client ne puisse jamais atteindre les données ou les fichiers d'un autre.
- Confinez les chemins de fichiers. Lorsqu'une requête désigne un fichier, résolvez-le et confirmez qu'il reste dans le répertoire autorisé, et que la vérification s'arrête au séparateur de chemin, afin qu'un dossier voisin au nom plus long ne soit pas accessible.
Comment tester
- Créez deux comptes. Depuis le compte A, demandez directement les identifiants d'objets du compte B. Rien appartenant à B ne doit être renvoyé.
- Appelez une route d'administration avec le jeton d'un utilisateur ordinaire. Attendez-vous à un 403.
- Envoyez des chemins de type
../et des chemins au préfixe commun sur chaque point d'accès aux fichiers.