[Pregunta]: Lógica PHP "olvide mi contraseña"

Iniciado por Leguim, 4 Octubre 2019, 03:11 AM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Buenas noches,
no voy a pedir códigos y esas cosas por que de eso me ocupo yo pero si que me encantaría que me pudieran dar una mano con la parte por así decir "teórica" la lógica del sistema.

Se me había ocurrido hacer así:

El usuario tendrá que ingresar una dirección de correo electrónico (Naturalmente la de su cuenta que no puede ingresar porque se olvido su contraseña), luego de esto se le enviará un mail con el código de cambió de contraseña, este código lo que permite es que se pueda editar dicha contraseña...

El código esta compuesto por 20 caracteres numéricos random + 2 letras en mayúsculas random.

Entonces no se si esto es muy seguro, no quiero que tampoco una persona la cual no es dueña de dicha cuenta vaya cambiando de código en código hasta poder acertar para cambiar una contraseña de una cuenta que como ya dije no le pertenece.

¿Cuales son sus sugerencias o tienen alguna lógica mejorada para esto?

@XSStringManolo

Cita de: MiguelCanellas en  4 Octubre 2019, 03:11 AM
Buenas noches,
no voy a pedir códigos y esas cosas por que de eso me ocupo yo pero si que me encantaría que me pudieran dar una mano con la parte por así decir "teórica" la lógica del sistema.

Se me había ocurrido hacer así:

El usuario tendrá que ingresar una dirección de correo electrónico (Naturalmente la de su cuenta que no puede ingresar porque se olvido su contraseña), luego de esto se le enviará un mail con el código de cambió de contraseña, este código lo que permite es que se pueda editar dicha contraseña...

El código esta compuesto por 20 caracteres numéricos random + 2 letras en mayúsculas random.

Entonces no se si esto es muy seguro, no quiero que tampoco una persona la cual no es dueña de dicha cuenta vaya cambiando de código en código hasta poder acertar para cambiar una contraseña de una cuenta que como ya dije no le pertenece.

¿Cuales son sus sugerencias o tienen alguna lógica mejorada para esto?
Limita los intentos. Si introduce el codigo mal le pones: Tienes que introducir el código que se te envió por correo. Intentos restantes 3.
A partir de ahí le vas metiendo tiempo de espera:
Has superado el número de intentos. Espere 5 minutos.
Has superado el número de intentos. Espere 10 minutos.
...

Es segura dependiendo de como generes esos caracteres "aleatorios".
La aletoriedad en informática no existe. Si usas una semilla para generar la cadena y alguien se dedica a crearse cuentas en tu plataforma y pedir códigos, puede que averigue la semilla.

Recuerdo un server que usaba una semilla para algo similar. Imagínate la serie:
1 1 2 3 5 8 13 21 34 45 89...

Si yo te pido el código y me das "5" no averiguo nada.

Si 4 horas más tarde te pido otro y me das "89" tampoco saco nada.

Pero si te mando 5 peticiones a la vez desde distintos equipos y veo:
"8" "13" "21" "34" "45" ya entiendo la serie y sé que el siguiente número es la suma de los 2 anteriores.

Sabiendo esto, podría tirarte el servidor y mandarte otras 5 peticiones.
Entonces obtendría:
"1" "1" "2" "3" "5". Sabiendo esto, sé que si te pido 5 codigos para correos del sistema, los códigos que le vas a enviar van a ser alguno de estos: "8" "13" "21" "34" "55" "89" "144"...

Para generar cadenas aleatorias utiliza un algoritmo CSPRNG (Generador de Numeros Pseudo-Aleatorios Criptográficamente Seguro)

Entonces toda la seguridad recae en que se envie el código de forma segura y que el cliente acceda de forma segura a su cliente de correo.

También ten cuidado con nunca dejar ver a los usuarios sus contraseñas de ninguna forma y de que la página de recuperación y el link a la misma se diferencie bastante de la página de login.

Un usuario mal intencionado podría hacerse una cuenta, pedirte el código de restablecer contraseña. Y enviárselo a otro usuario del sistema:

Enviado por MiguelCanellas@protonmail.com
Querido usuario, nuestra plataforma cumple 1 año y queremos celebrarlo contigo. Por eso estamos habilitando nuevas funcionalidades para las 40 primeras cuentas que ingresen en el día de hoy Viernes, 4 de Octubre de 2019. NUEVOS AVATARES para tu perfil, Bonos descuento, tarjetas regalos para Amazon y Google Play... Y mucho más.
Para participar solo debes ingresar tu código de celebración ndiwndlq1wma4wSjFs para activar la promoción e ingresar con tu contraseña. www.example.com/...
Recuerda que example.com jamás te pedirá tu contraseña ni tus datos por email.

Atte: MiguelCanellas. Fundador y Administrador de example.com


Algun usuario irá como loco y meterá el código y su contraseña varias veces.

Resultado? Si el atacante puede ver la contraseña de su cuenta verá la nueva contraseña introducida por la víctima, a.k.a. su contraseña habitual.

Por eso es buena idea cerrar sessiones cuando se cambian contraseñas, páginas muy distintas en diseño, no mostrar contraseñas en ningún momento, etc.
Piensa que ahora el atacante aún sin ver la contraseña podría hablar con el soporte o con el admin preguntando por su contraseña y demostrando que la cuenta es realmente suya, porque lo es.

No se suelen prestar tanta atención a las políticas pero son igual de importantes que el diseño del sistema. La mayoría de ataques usan el engaño, intenta protegerte de eso que siempre se obvia.

MinusFour

Si usas PHP 7, puedes usar la función random_bytes:

Código (php) [Seleccionar]

random_bytes(10); //20 caracteres, 10 bytes, 80 bits

@XSStringManolo

Cita de: MinusFour en  4 Octubre 2019, 14:02 PM
Si usas PHP 7, puedes usar la función random_bytes:

Código (php) [Seleccionar]

random_bytes(10); //20 caracteres, 10 bytes, 80 bits

Aqui tienes extendido el uso en distintas versiones de PHP y otras alternativas. https://dev.to/czarpino/php-pseudo-random-string-161f