Authentification et sessions
Comment les utilisateurs prouvent qui ils sont, et comment vous les gardez connectés sans remettre les clés à un attaquant. C'est la surface la plus attaquée de toute application.
Liste de contrôle
- Hachez les mots de passe avec un algorithme lent et salé. Utilisez bcrypt, scrypt ou Argon2, jamais un simple SHA ou MD5, et ne stockez jamais de texte en clair. Si vous pouvez lire le mot de passe d'un utilisateur, un attaquant qui accède à votre base de données le peut aussi.
- Limitez les tentatives de connexion et de réinitialisation. Plafonnez le nombre de tentatives par IP et par compte (par exemple dix par quinze minutes), puis renvoyez 429. Sans cela, la force brute est triviale.
- Ne révélez pas quels e-mails existent. La connexion, l'inscription et la réinitialisation du mot de passe doivent renvoyer la même réponse générique, que le compte existe ou non, avec des délais et des codes de statut cohérents.
- Rendez les jetons de réinitialisation et de vérification éphémères et à usage unique. Une heure ou moins, invalidés dès la première utilisation. Traitez-les comme des mots de passe.
- Liez le flux OAuth au navigateur qui l'a démarré. Si vous connectez via Google, GitHub ou un service similaire, stockez une valeur
statedans un cookie lors de la requête de départ et comparez-la lors du retour (callback). Sans ce lien, un attaquant peut envoyer à une victime un lien qui la connecte au compte de l'attaquant (CSRF de connexion). Voir API et requêtes. - Validez la réponse du fournisseur d'identité. Exigez un e-mail vérifié, contrôlez l'audience et l'émetteur du jeton, et ne faites jamais confiance à un identifiant fourni par le client.
- Si vous proposez une authentification multifacteur, conditionnez la deuxième étape à la première. Le second facteur ne doit être accessible qu'après la réussite de la vérification du mot de passe, avec un défi à usage unique, sinon l'espace des codes peut être attaqué par force brute à lui seul.
- Faites expirer les sessions et prévoyez la révocation. Fixez une durée de vie raisonnable pour les jetons, et faites en sorte qu'un changement de mot de passe invalide toutes les sessions existantes.
- Vérifiez votre mot de passe contre une liste de mots de passe compromis (par exemple l'API HIBP à k-anonymat) lors de l'inscription et de la réinitialisation.
Comment tester
- Simulez cinquante connexions erronées et vérifiez que vous êtes bien limité.
- Comparez la réponse à la réinitialisation pour un e-mail réel et pour un e-mail fictif. Elles doivent être identiques.
- Démarrez une connexion OAuth dans un navigateur et terminez-la dans un autre. Elle doit échouer.