J'essaie de comprendre les meilleures pratiques pour travailler avec des jetons de réinitialisation du mot de passe.
Dites à un utilisateur initie le processus de réinitialisation du mot de passe et les jetons de réinitialisation sont envoyés par courrier électronique et nous stockons une copie hachée dans la base de données. Le jeton est horodaté dans notre dB et sera considéré comme expiré dans, disons, 24 heures.
Prenez maintenant deux scénarios pour ce qui pourrait arriver ensuite:
1) L'utilisateur pense qu'il n'a pas reçu l'email, essaie de réinitialiser à nouveau. Devrions-nous lui permettre de générer un autre jeton? Si nous faisons, devrions-nous supprimer le vieil jeton immédiatement? (Ils seront tous invalides à partir de 24 heures après le numéro datetime
de toute façon ...) Je pense que cela minimiserait les appels de support si nous permettons une petite flexibilité tant qu'ils expirent de toute façon. Y a-t-il un type d'attaque que je ne considère pas ici?
2) L'utilisateur a reçu l'e-mail et clique sur le lien de réinitialisation mais ne remplit pas le formulaire de réinitialisation. Quand devrais-je supprimer le jeton de réinitialisation? Seulement après une réinitialisation réussie - l'utilisateur peut cliquer sur le lien à nouveau et à nouveau pendant les 24 heures et cela ne devient invalide que lorsqu'il réinitialise enfin le mot de passe. Ou devrais-je supprimer le jeton dès qu'il clique sur le lien pour une préoccupation de sécurité? (Tout cela se produit avant l'expiration)
Vous ne devez pas réinitialiser le jeton lorsque l'utilisateur clique dessus, car l'utilisateur pourrait être perturbé dans le processus (par exemple, son chat a sauté sur le clavier - le mien fait-le sur une base trop régulière).
(Il y a deux jours, j'utilisais un tel lien - pas pour la réinitialisation de mot de passe, mais similaire - qui a été désactivé dès que j'ai cliqué dessus, et il s'est avéré que la page derrière celle-ci n'était pas compatible avec Chrome. Donc j'avais eu Pour demander un nouveau lien, faire tout le processus une fois de plus, et je les maudit pour cela. Lorsque vous traitez avec des mots de passe, vous voulez et devez faire une alliance coopérative de l'utilisateur, et certainement pas le faire en colère.)
Lorsque le mot de passe est réinitialisé, tous les liens de réinitialisation du mot de passe en attente doivent être désactivés. Il est plus simple si vous n'autorisez qu'un seul lien de réinitialisation à la fois; Si l'utilisateur demande une réinitialisation du mot de passe lorsque le lien précédent est toujours valide, envoyez-le simplement (éventuellement, réinitialiser le compteur de délai d'attente). Il n'est pas nécessaire de supporter plusieurs liaisons de réinitialisation de mot de passe de validité simultanément . Un lien à la fois signifie une conception de base de données plus facile et donc moins de punaises de bugs.