mi duda es la siguiente, yo quiero un script para que el usuario pueda recuperar su contraseña, pero que cumpla los siguientes parametros:
1. El usuario entra en una vista donde se le solicita su email y que
llene un captchar (uso el de google)
2. Se validan los datos si los datos son correctos procede al paso 3
sino solo confirma el envió de correo (esto es para que un usuario no
intente usar varios correos buscando un resultado.
3. Este genera en una tabla aparte una contraseña y un keytoken y la
hora que se creo la contraseña. Se envía un correo con el KeyToken al
correo introducido.
4. El correo le indica al usuario que se solicito un cambio de
contraseña y para poder realizar el proceso debe validar el proceso
haciendo click en el vinculo que trae el correo.
5. Si hace click en el vinculo llega a una vista que el confirma que
se a validado el proceso y se le enviara la contraseña, dentro de la
validación se verifica la hora que es y la que se guardo en la base de
datos si ha pasado más de 24 hora envía un error que el token no es
valido.
6. Se envía un correo con la nueva contraseña y se actualiza la nueva
contraseña en la tabla de usuarios.
Actualmente estoy usando el siguiente script, pero no me gusta ya que cualquiera que conozca el correo del usuario puede cambiar su contraseña.
Código PHP:
<?php
include('acceso_db.php'); // incluímos los datos de acceso a la BD
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<?php
if(isset($_POST['enviar'])) { // comprobamos que se han enviado los datos del formulario
if(empty($_POST['usuario_nombre'])) {
echo "No ha ingresado el usuario. <a href='javascript:history.back();'>Reintentar</a>";
}else {
$usuario_nombre = mysql_real_escape_string($_POST['usuario_nombre']);
$usuario_nombre = trim($usuario_nombre);
$sql = mysql_query("SELECT usuario_nombre, usuario_clave, usuario_email FROM usuarios WHERE usuario_nombre='".$usuario_nombre."'");
if(mysql_num_rows($sql)) {
$row = mysql_fetch_assoc($sql);
$num_caracteres = "10"; // asignamos el número de caracteres que va a tener la nueva contraseña
$nueva_clave = substr(md5(rand()),0,$num_caracteres); // generamos una nueva contraseña de forma aleatoria
$usuario_nombre = $row['usuario_nombre'];
$usuario_clave = $nueva_clave; // la nueva contraseña que se enviará por correo al usuario
$usuario_clave2 = md5($usuario_clave); // encriptamos la nueva contraseña para guardarla en la BD
$usuario_email = $row['usuario_email'];
// actualizamos los datos (contraseña) del usuario que solicitó su contraseña
mysql_query("UPDATE usuarios SET usuario_clave='".$usuario_clave2."' WHERE usuario_nombre='".$usuario_nombre."'");
// Enviamos por email la nueva contraseña
$remite_nombre = ""; // Tu nombre o el de tu página
$remite_email = ""; // tu correo
$asunto = "Recuperación de contraseña"; // Asunto (se puede cambiar)
$mensaje = "Se ha generado una nueva contraseña para el usuario <strong>".$usuario_nombre."</strong>. La nueva contraseña es: <strong>".$usuario_clave."</strong>.";
$cabeceras = "From: ".$remite_nombre." <".$remite_email.">\r\n";
$cabeceras = $cabeceras."Mime-Version: 1.0\n";
$cabeceras = $cabeceras."Content-Type: text/html";
$enviar_email = mail($usuario_email,$asunto,$mensaje,$cabeceras);
if($enviar_email) {
echo "La nueva contraseña ha sido enviada al email asociado al usuario ".$usuario_nombre.".";
}else {
echo "No se ha podido enviar el email. <a href='javascript:history.back();'>Reintentar</a>";
}
}else {
echo "El usuario <strong>".$usuario_nombre."</strong> no está registrado. <a href='javascript:history.back();'>Reintentar</a>";
}
}
}else {
?>
<form action="<?=$_SERVER['PHP_SELF']?>" method="post">
<label>Usuario:</label><br />
<input type="text" name="usuario_nombre" /><br />
<input type="submit" name="enviar" value="Enviar" />
</form>
<?php
}
?>
</body>
</html>