web-dev-qa-db-fra.com

Quand, exactement, si de vieux jetons de réinitialisation de mot de passe doivent être supprimés?

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)

9
John

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.

9
Tom Leek
  • Je suggérerais de permettre à l'utilisateur de demander une réinitialisation de mot de passe uniquement une fois que vous n'avez qu'un seul jeton de réinitialisation à la fois.
  • Vous pouvez toujours suivre si le courrier a été envoyé avec succès et que vous stockez uniquement le jeton de réinitialisation dans la base de données.
  • Si l'utilisateur tente de le refaire (et qu'un lien de réinitialisation active est présent) avertit l'utilisateur disant que "le lien de réinitialisation est déjà envoyé".
  • À propos de la suppression des jetons de mot de passe: ils doivent être supprimés instantanément une fois que le mot de passe a été réinitialisé avec succès et non après avoir cliqué sur le lien de repos.
  • Une alternative possible consiste à réinitialiser le mot de passe de l'utilisateur et à le mettre à jour dans la DB. Envoyer un mail à l'utilisateur notifiant que "Ceci est votre nouveau mot de passe le modifie immédiatement
  • Veuillez noter que le processus de réinitialisation du mot de passe sera toujours vulnérable si la communication par courrier électronique est non cryptée. Par limitation du temps L'URL de réinitialisation, on peut essayer de minimiser la fenêtre d'attaque pour une attaque potentielle.
0
Shurmajee