Hola de nuevo...
Esta vez estoy intentando que los usuarios que hayan perdido/olvidado la contraseña puedo recuperarla.
Para eso, se dirigen a esta página:
recuperar.php
Código HTML:
Ver original<?php
//Esto destruye cualquier sesión anterior.
session_start();
session_destroy();
session_start();
?>
<form method="POST" action="recuperacion.php" />
<p>Si has perdido o no recuerdas tu contraseña, podrás establecer una nueva.
</p>
<input type="email" name="email" id="email" maxlength="50" size="30" required/>
<input type="submit" name="submit" value="Siguiente" class="btn" >
<p><a href="http://www.ejemplo.com/BD/registro" target="_self">Registrarse
</a> |
<a href="http://www.ejemplo.com/BD/entrar" target="_self">Entrar
</a></p>
En ese formulario, escriben el mail asociado con la cuenta.
Cuando cliqueen en "Siguiente", los lleva a:
recuperacion.php
Código PHP:
Ver original<?php
// Carga la configuración
// Conexión con los datos del 'config.ini'
$connection = mysqli_connect('localhost',$config['username'],$config['password'],$config['dbname']);
// Si la conexión falla, aparece el error
if($connection === false) {
}
$email = $_POST['email'];
$_SESSION['email'] = $email; //guarda el email en una variable de session para recuperarlo en el siguiente form
$noreg = "";
$mensaje = "";
// Genera una clave aleatoria
function generate_random_key() {
$chars = "abcdefghijklmnopqrstuvwxyz123456789";
$new_key = "";
for ($i = 5; $i < 32; $i++) {
$new_key .= $chars[rand(5,35)]; }
return $new_key;
};//Final de la funcion
$random_key = generate_random_key();
if(isset($_POST['email']) ) { //comprobamos que el campo email trae algun valor
$query = "SELECT * FROM usuarios WHERE email='$email'"; //seleccionamos la informacion de la BD correspondiente al email del user
if (($row['password']) == TRUE) { //compruebo que exista el password del email enviado
//$_SESSION['email'] = $row['email']; //guardamos el usuario en una variable de sesion
$mensajehtml = "Se le ha enviado un e-mail con los datos necesarios para crear una nueva contraseña. ";
//Si está correcto, entonces envía el mail
// Datos del email
$nombre_origen = "NueveReinas";
$email_destino = "".$email."";
$asunto = "Nueva contraseña";
$mensaje = '
Hola, recientemente has pedido una nueva contraseña para XXX. <br>
<br>
Para poder crear una nueva contraseña entra en el siguiente enlace: <br>
<br>
<strong>http://www.ejemplo.com/BD/recuperar_2.php?activation='.$random_key.'</strong><br>
<br>
Si no podés entrar haciendo click, copialo y pegalo en la barra del navegador.<br>
<br>
Gracias.
';
$formato = "html";
//*****************************************************************//
$headers = "From: $nombre_origen <$email_origen> \r\n";
$headers .= "X-Priority: 3 \r\n";
$headers .= "MIME-Version: 1.0 \r\n";
$headers .= "Content-Transfer-Encoding: 7bit \r\n";
//*****************************************************************//
if($formato == "html")
{ $headers .= "Content-Type: text/html; charset=iso-8859-1 \r\n"; }
else
{ $headers .= "Content-Type: text/plain; charset=iso-8859-1 \r\n"; }
if (@mail($email_destino, $asunto, $mensaje, $headers)) { };
}
};
}
else {
$mensajehtml = "El email no esta registrado en nuestra base de datos."; //si no existe ese mail...
//session_destroy();
//$connection->close();
};
?>
Aquí genera una clave aleatoria que se comprueba después, revisa que el FORM anterior no esté vacío, y entonces envía un mail al $POST proporcionado del tipo
Código:
http://www.ejemplo.com/BD/recuperar_2.php?activation=tu8i59i5pxwn2d5figjhtso64m
Entonces, al hacer click, les lleva a:
recuperar_2.php
Código HTML:
Ver original<?php
session_start();
$email = $_SESSION['email'];
?>
<form method="POST" action="recuperacion-segura" /> <input type="password" name="password" id="password" minlength="6" required /> <input type="password" name="password2" id="password2" minlength="6" required /> <input type="submit" name="btn" class="btn" value="Enviar"/> <p>EMAIL:
<?php echo $email ?></p>
Y acá empiezan los problemas.
No me toma la sesión de la variable $email
.
Por último, ese formulario lleva al usuario a:
recuperacion-segura
Código PHP:
Ver original<?php
// Carga la configuración
// Conexión con los datos del 'config.ini'
$connection = mysqli_connect('localhost',$config['username'],$config['password'],$config['dbname']);
// Si la conexión falla, aparece el error
if($connection === false) {
}
$_SESSION['email'] = $email; //Obtenemos la variable se sesion
$activation_key = $_GET["activation"]; //Obtenemos la clave del email
//$noreg = "";
$titulo = "";
$dbh = $connection;
// Busca la entrada en la tabla de usuarios para la clave de activación recibida
$stm = $dbh->prepare("SELECT count(1) FROM usuarios WHERE activation_key=?"); //=?
/*$stm->bind_param("s",$activation_key);*/
$stm->bind_result($total);
$stm->execute();
$stm->fetch();
$stm->close();
if ($total == 1) { // Si se ha encontrado...
$password = $_POST["password"]; //variable que viene del campo del form pasword
$password2 = $_POST["password2"];//variable que viene del campo del form pasword2
if (isset($_POST["password"])) {
$password = $_POST["password"]; //variable que viene del campo del form pasword
$password2 = $_POST["password2"];//variable que viene del campo del form pasword2
/*$password = md5($password); // codificamos los password con md5
$password2 = md5($password2); */
//$email = $_SESSION['email']; // recogemos la variable email y username que guardamos en la sesion en el script anterior
// Hay campos en blanco
if($password==NULL|$password2==NULL) {
$error = "Un campo o ambos campos están vacíos.";
$titulo = "Error";
}
else {
// ¿Coinciden las contraseñas?
if($password!=$password2) {
$error = "Las contraseñas no coinciden. Por favor, inténtelo de nuevo. <br>";
$titulo = "Error";
}
else {
$password_cifrada = crypt($password); $query = "UPDATE usuarios SET password='$password_cifrada' WHERE email='$email' ";
/*
//obtengo los datos del usuario para mandar el email
$result = "SELECT * FROM usuarios WHERE password='$password' ";
$result = mysqli_query($connection,$result) or die ( mysql_error() );
$row = mysqli_fetch_array($result);
*/
$titulo = "Nueva contraseña asignada";
$hecho = 'Nueva contraseña asignada a '.$email.'<br><br>
Ya puedes <a href="http://www.ejemplo.com/BD/entrar" target="_self">entrar</a>.';
//session_destroy();
/////////////////////////////////////////////////
// Datos del email
$nombre_origen = "NueveReinas";
$email_destino = "".$email."";
$asunto = "Tu nueva contraseña";
$mensaje = '
Hola, recientemente has creado una nueva contraseña para XXX. <br>
<br>
Esa contraseña es: <strong>'.$password.'</strong>';
$formato = "html";
//*****************************************************************//
$headers = "From: $nombre_origen <$email_origen> \r\n";
$headers .= "X-Priority: 3 \r\n";
$headers .= "MIME-Version: 1.0 \r\n";
$headers .= "Content-Transfer-Encoding: 7bit \r\n";
//*****************************************************************//
if($formato == "html")
{ $headers .= "Content-Type: text/html; charset=iso-8859-1 \r\n"; }
else
{ $headers .= "Content-Type: text/plain; charset=iso-8859-1 \r\n"; }
if (@mail($email_destino, $asunto, $mensaje, $headers)) { };
}
};
/////////////////////////////////////////////////
}
};
?>
<body>
<div align="center">
<div class="cuadro">
<p><?php echo $noreg ?></p>
<p><?php echo $error ?></p>
<p><?php echo $hecho ?></p>
<p>EMAIL: <?php echo $email ?></p>
</div>
</div>
</body>
Bien, se que es complicado, pero no termina de agarrar la sesión. En ningún momento, más allá de en el inicio, destruyo ninguna sesión.
Se pierde la variable entre el link del mail y
recuperar_2.php.