Foros del Web » Programando para Internet » PHP »

Recuperar contraseña - Get -> Email y Codigo

Estas en el tema de Recuperar contraseña - Get -> Email y Codigo en el foro de PHP en Foros del Web. Hola a todos! Les cuento que estoy intentando hacer 2 secciones para una web, activacion de cuenta y recuperacion de contraseña, y tienen en parte ...
  #1 (permalink)  
Antiguo 03/06/2013, 08:31
 
Fecha de Ingreso: marzo-2012
Mensajes: 102
Antigüedad: 12 años, 1 mes
Puntos: 1
Recuperar contraseña - Get -> Email y Codigo

Hola a todos!

Les cuento que estoy intentando hacer 2 secciones para una web, activacion de cuenta y recuperacion de contraseña, y tienen en parte la misma funcionalidad.

Esto seria, enviar un mail a la cuenta del usuario con un link de tipo email + codigo.

El codigo es generado dentro de su respectiva clase (activacion/recuperacion) usando:

Código:
$this->_Code = md5(uniqid(rand(), true));
y el link por ej:

Código:
/activacion.php?email=' . urlencode($this->_usermail) . "&key=".$this->_Code; // se insertara dentro de $message
El mismo, se guarda en la base de datos y al usuario clickear dicho link manda a la respectiva pagina y si el email y el codigo son correctos:
- activacion: activa la cuenta.
- recuperacion: muestra un formulario para cambiar por una nueva contraseña.

He leido que es la manera de realizarlo por muchos (muchos recomiendan no enviar una nueva contraseña al mail por cuestiones de usabilidad).

Pero no entiendo bien si esto es seguro ya que, por ej un usuario no podria usar un script usando dicha url con un correo y hacer combinar cadenas de 32 caracteres hasta que funcione y tener acceso a dicha cuenta? o activarla manualmente?

como veran lo mio es mas bien una cuestion conceptual..

saludos y gracias por cualquier ayuda!

edito: Ambos codigos expiran a las 24 horas de enviados..
  #2 (permalink)  
Antiguo 03/06/2013, 08:54
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Recuperar contraseña - Get -> Email y Codigo

Lo basico: nada es 100% seguro.
tu tienes razón pero mientras mas largo es string es mas dificil de desifrar.

Recomendacion: crea tu propio algoridmo de seguridad.

ejemplo:

$this->_Code = md5(uniqid(rand(), true)).md5(usuario).md5(date('ydmhis')."f");

usar la imaginacion es mucho mas facil.
  #3 (permalink)  
Antiguo 03/06/2013, 09:01
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Recuperar contraseña - Get -> Email y Codigo

por eso para pedir dicha generación de recuperación de clave se le pide al usuario que coloque o su nombre de usuario, o correo, si uno de ellos no existe, no se genera ningún código aleatorio.

claro, si un atacante descubre uno de dos, y se logra generar el código el cual llega al correo pero el atacante obviamente no tiene, es donde espesará a invadir la url aplicando hashes aleatorios, la idea es invalidar el primer intento de un hash que no coincida con un mail; así reduces de un tajo la probabilidad de que al n intento logre conseguir el hash correcto, para ese entonces se invalida la regeneración de contraseña.

y concuerdo con @enlinea777, mientras más complejo sea el hash, más difícil vulnerarlo.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #4 (permalink)  
Antiguo 03/06/2013, 09:04
 
Fecha de Ingreso: marzo-2012
Mensajes: 102
Antigüedad: 12 años, 1 mes
Puntos: 1
Respuesta: Recuperar contraseña - Get -> Email y Codigo

gracias por responder tan rapido!

no habia pensado lo que dices, pero eso me habre otra interrogante que va ligada a que termino de entender muy bien el concepto de dicho algoritmo..

si yo creara un algoritmo como el que dices, no es indistinta la forma de crearlo si quien intenta ingresar el codigo haciendo distintas combinaciones para un email termina acertando dicho codigo? a final de cuentas no es meramente una cadena de 32 caracteres.. ¿?
  #5 (permalink)  
Antiguo 03/06/2013, 09:10
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Recuperar contraseña - Get -> Email y Codigo

MD5 no es el único hash, php dispone de más funciones para crear diferentes hashes, además nada te impide concatenarlos, extraer fragmentos con substr, además hay hashes con diferentes longitudes.

además, multiplica el total de combinaciones que pueden darse en una cadena de 32 caracteres, son muchas.

como te indicaron, nada es 100% seguro, pero hasta que nadie descubra como vulnerar eso, se puede decir que es 99.99% seguro
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #6 (permalink)  
Antiguo 03/06/2013, 09:28
 
Fecha de Ingreso: marzo-2012
Mensajes: 102
Antigüedad: 12 años, 1 mes
Puntos: 1
Respuesta: Recuperar contraseña - Get -> Email y Codigo

gracias maycol..
es cierto lo que dices, he leido sobre otros hashes como sha,.. pero me gusta la idea (que no se me habia ocurrido) de concatenar. Me parece algo creativo y util si se usa con substr.. buena idea!

Cita:
nada es 100% seguro, pero hasta que nadie descubra como vulnerar eso, se puede decir que es 99.99% seguro
:D
  #7 (permalink)  
Antiguo 03/06/2013, 14:01
 
Fecha de Ingreso: marzo-2012
Mensajes: 102
Antigüedad: 12 años, 1 mes
Puntos: 1
Respuesta: Recuperar contraseña - Get -> Email y Codigo

Cita:
claro, si un atacante descubre uno de dos, y se logra generar el código el cual llega al correo pero el atacante obviamente no tiene, es donde espesará a invadir la url aplicando hashes aleatorios, la idea es invalidar el primer intento de un hash que no coincida con un mail; así reduces de un tajo la probabilidad de que al n intento logre conseguir el hash correcto, para ese entonces se invalida la regeneración de contraseña.

1) la invalidacion si encuentra un email e intenta fallidamente, podria ser..

- borrar el registro en la tabla que guarda los pedidos de recuperacion en la base obligando a solicitar recuperacion nuevamente?

- bloquear pedidos de recuperacion por x tiempo a partir de x intentos fallidos para ese email?


pero para el caso que este buscando direcciones, como se podria invalidar los intentos cuando no coincidan con un emal? entiendo que bloquear ip's no serviria si las cambia en cada intento..



2) Al margen de la solucion de concatenar y hacer substr (que es lo que creo hare unido a otro algoritmo)..

La forma en que genere el codigo influye en alguna manera si el atacante ingresa el codigo justo?
  #8 (permalink)  
Antiguo 03/06/2013, 14:15
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Recuperar contraseña - Get -> Email y Codigo

1 - se supone que tienes en la DB un hash asociado a un email, pera dar el acceso al usuario en la URL pasas ambos (email y el hash), lo primero que haces es buscar el registro por email, si no existe ninguno bloqueas el intento, pero si existe y no coincide el hash: bloqueas el intento;

se supone que si todo sale bien, muestres el form para cambiar la contraseña.

2 - ) claro, porque él no sabe como generas el hash, pero puede llegar a reconocerlo si ve un hash tan obvio como uno de 32 caracteres, es por ello que si aplicas ciertas combinaciones le resultará más difícil, incluso puedes determinar un rango de longitud de por ejemplo entre 40 y 60 caracteres y generar de forma aleatoria de cuanto será el largo.

¿quieres evitar bots?: simple: genera un captcha justo antes de mostrar el formulario de recuperación, independientemente de si el código es correcto o no, la idea es jugar con las sesiones, si el código hash es correcto, el usuario debe enviar el captcha, y si todo va bien muestras el form.

si el código es incorrecto, muestras igual el captcha, al validar el captcha muestras el error de código inválido o expirado, al menos es una alternativa a prueba de bots, porque para acceder al form deben de interpretar un captcha, poniéndoselas más difícil
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #9 (permalink)  
Antiguo 03/06/2013, 15:21
 
Fecha de Ingreso: marzo-2012
Mensajes: 102
Antigüedad: 12 años, 1 mes
Puntos: 1
Respuesta: Recuperar contraseña - Get -> Email y Codigo

la forma de evitar los bots me parece genial y creo que la implementare. Ya incluso tenia un recaptcha para solicitar el mail de recuperacion pero creo que pondre al enviar la respuesta al mail para ver el resultado si es exitoso..


Ahora, sobre el hash no creo estar entendiendo bien las cosas: el concepto de hash, estoy viendo videos y leyendo pero algo no me queda)..

lo que venia haciendo (al margen del algoritmo) es lo que sigue:

Código:
$codigo = md5(uniqid(rand(), true));
// insertaba $codigo en la base de datos
//luego
$link = 'activacion.php?email=$email&key=$codigo'

// Y en su respuesta
if($codigo == $_GET['key'])
Y aqui es adonde creo estar mal. Estoy simplemente, generando un numero aleatorio, guardando y enviandolo para comprobar luego el mismo..



quizas deberia estar haciendo en realidad algo como..

Código:
$codigoAleatorio = md5(uniqid(rand(), true)); // Lo guardo en la base

$codigoDeActivacion = md5($idusuario.$email.$codigoAleatorio);

$link = 'activacion.php?id=$idusuario&email=$email&key=$codigoDeActivacion'


// LUEGO POR GET
// IF id, email y key estan en la url

if($codigoDeActivacion === md5($_GET['idusuario'].$_GET['email'].$codigoTraidoDeLaBase))
asi, el atacante deberia acertar en la url no solo el email y un codigo aleatorio, sino tambien el id y la composicion de dicho codigo?

Etiquetas: contraseña, email, formulario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:16.