¿Qué tan seguro está mi sistema para restablecer la contraseña?

4

Estoy usando mi servidor Parse personalizado con Heroku, por lo que estoy bastante seguro (99%) de que es bastante seguro usar cosas como oAuth2 y contraseñas de hash de 1 vía.

El problema es que estoy intentando implementar mi propio restablecimiento de contraseña personalizado .

Esto es lo que estoy haciendo actualmente:

  • El usuario solicita restablecer la contraseña

  • Se genera un token personalizado (tiene un temporizador que debe eliminarse después de 10 minutos)

  • Se envía un correo electrónico con una solicitud POST de http (s) para publicar la identificación del token

  • Mi aplicación comprueba si existe la identificación del token

  • Si es verdadero, el usuario es redirigido a una página web donde puede restablecer su contraseña

  • El usuario hace clic en enviar y su nueva contraseña se publica mediante http (s) POST

  • Mi servidor puede procesar y establecer la nueva contraseña de forma segura

Primero que nada, ¿es un problema el uso de una solicitud inicial de publicación de http (s) con el identificador del token para solicitar un restablecimiento de la contraseña? Sé que si alguien consiguió este enlace físico mientras estaba activo (en 10 minutos) podría cambiar la contraseña de un usuario y luego iniciar sesión.

En segundo lugar, cuando hago otra solicitud POST de http (s) con la nueva contraseña de usuario, ¿el método es "decentemente" seguro y una práctica segura? ¿Porque una vez más, si alguien pudiera de alguna manera interceptar la solicitud, podría obtener acceso a la "nueva" contraseña de los usuarios?

El restablecimiento de mi contraseña no necesita ser perfecto, sin embargo, quiero que sea una buena práctica.

¿Hay algo grave en lo que estoy haciendo mal / cometiendo un error? En caso afirmativo, ¿qué debo hacer para solucionarlo?

* Note que uso "http (s)" con (s) entre paréntesis porque todavía no he traído un SSL.

Gracias.

    
pregunta Josh 28.04.2016 - 16:31
fuente

1 respuesta

4

En general, no es aconsejable implementar su propio manejo de sesión. Si puede, estaría mejor utilizando una implementación bien conocida y probada.

Estos son los problemas que veo en su procedimiento.

El usuario solicita restablecer la contraseña

¿Cómo manejará el uso indebido de esta función? ¿Enviará un correo electrónico por intento de reinicio o implementará una restricción para evitar el uso indebido?

Se genera un token personalizado (tiene un temporizador que debe eliminarse después de 10 minutos)

¿Cómo generarás el token? Hay muchos ataques a números "aleatorios".

¿Qué ocurrirá si falla el temporizador? ¿Tendrá validez el token de restablecimiento de la contraseña para siempre? ¿Qué tal si almacenamos la fecha en que se generó y luego solo permitimos tokens que están "nuevos"?

Se envía un correo electrónico con una solicitud POST de http (s) para publicar la identificación del token

Creo que un enlace ordinario es una mejor opción aquí. POST requerirá que los clientes de correo acepten formularios html o javascript, lo que la mayoría no hace.

Mi aplicación comprueba si existe el ID de token. Si es verdadero, al usuario se le redirige una página web donde puede restablecer su contraseña

¿Dónde se ubicará la página web redirigida? También debería ser impredecible o requerir el token de restablecimiento de la contraseña para evitar omitir vulnerabilidades .

El usuario hace clic en enviar y su nueva contraseña se publica utilizando http (s) POST Mi servidor puede procesar y establecer la nueva contraseña de forma segura

Suena razonable

-

Ahora, también debe invalidar el token de restablecimiento de contraseña. No es necesario dejarlo flotar si se ha utilizado.

Y no hace falta decir que HTTPS es una buena idea.

    
respondido por el Dog eat cat world 28.04.2016 - 16:52
fuente

Lea otras preguntas en las etiquetas