Puedo ver por qué querría un CAPTCHA, pero tomaría un enfoque diferente.
- Cuando se solicita un restablecimiento de contraseña de verificación que un reinicio ya no se ha solicitado para esa cuenta dentro de los últimos X minutos. Si ya se ha solicitado una contraseña, ignore la solicitud de restablecimiento.
- Compruebe la IP que solicita el restablecimiento de la contraseña. Si esa IP ha solicitado un restablecimiento de contraseña en el último Y minutos, ignore la solicitud.
- Si los controles en 1 & 2 pase comprobar la cuenta existe. Si no ignora la solicitud.
- Si hemos llegado hasta aquí, generemos un token de una vez, que vence en Z minutos y una URL de restablecimiento de contraseña que incluye este token. Envíe esto por correo electrónico a la dirección de correo electrónico registrada. Cuando se carga la URL, solicita una nueva contraseña y restablece.
Para aquellos que creen que debe decirle al usuario dónde se ha ido el correo electrónico Estoy totalmente en desacuerdo. Esto es "filtración de información", incluso si lo limita al nombre de dominio. Por ejemplo decir que me he registrado en JeffAtwoodEatsBabies.com como blowdart. Si Jeff hubiera solicitado un restablecimiento de contraseña para mí y usted mostró el dominio de registro, entonces vería idunno.org. Este es mi dominio personal y así Jeff sabría que el usuario de blowdart es, de hecho, yo. Esta es una cosa mala . No debería tener que registrarme usando hotmail o gmail o lo que sea para protegerme de su código que muestra un dominio de correo electrónico para todos.
Además no se debe mostrar mensajes de error en absoluto. No importa lo que suceda, un nombre de usuario no está realmente registrado, o se han realizado demasiadas solicitudes o el cielo ha caído, debería decirle al usuario que el procedimiento de restablecimiento de contraseña ha comenzado. Informar a un usuario que una cuenta no existe es más pérdida de información.
Una última cosa que podría hacer es agregar un token CSRF a la página de solicitud de restablecimiento, por lo que no puede ser conducido desde otros sitios web.
Seguimiento
Así que para responder a sus preguntas adicionales.
- Qué mensaje muestra es decisión suya. "Las instrucciones para restablecer su contraseña se han enviado por correo electrónico al correo electrónico registrado para esta cuenta" es una idea, pero realmente depende de su público.
- Ya mencionado anteriormente.
- Wikipedia es un buen starting point. Cómo lo hace depende de su plataforma y es una otra pregunta completa! Para ASP.NET usted podría mirar a mi proyecto CodePlex, http://anticsrf.codeplex.com o mirar en ViewStateUserKey.
- Cuando se haga clic en el enlace, primero validaría el token en la URL con el nombre de usuario al que se está aplicando, luego permitiría al usuario ingresar una nueva contraseña, o generar una nueva y enviarla por correo electrónico. No puede solicitar el anterior, ya que el punto es que el usuario lo ha olvidado.
¿Qué pasa si un usuario genuino ingresa su información pero accidentalmente la escribe mal? ahora les ha dicho que su proceso ha comenzado y es posible que no se den cuenta de su error y se ocupen de sus asuntos, pero nunca reciben el correo electrónico y se preguntan por qué su sitio está dañado. – Jason
Bueno, tienes que equilibrar la seguridad contra los usuarios malintencionados. Es solo una opción que el administrador del sitio puede hacer, pero en general, recomiendo que mis clientes estén del lado de la seguridad. Las filtraciones de información están en el Top 10 de OWASP; no son algo que deba tomarse a la ligera. – blowdart
Por favor ayuda más? He editado mi publicación para mayor consulta. –