Contenido:
¿Necesitas implementar una funcionalidad de recuperación de contraseña para tu sistema en PHP?
Aquí te enseño cómo hacerlo de manera segura y sencilla usando correo electrónico y PHP puro.
🛠️ ¿Qué necesitamos?
- Servidor web con soporte PHP (XAMPP, WAMP o hosting real)
- Base de datos MySQL para almacenar usuarios
- Función
mail()habilitada para enviar correos
📄 Paso 1: Crear el formulario de solicitud de recuperación
<form action="recuperar.php" method="POST">
<label>Correo electrónico:</label>
<input type="email" name="correo" required>
<input type="submit" name="enviar" value="Recuperar contraseña">
</form>
📄 Paso 2: Código PHP para generar y enviar el enlace de recuperación
recuperar.php
<?php
// Conexión a base de datos
$conexion = new mysqli("localhost", "usuario", "contraseña", "basededatos");
if (isset($_POST['enviar'])) {
$correo = filter_var($_POST['correo'], FILTER_VALIDATE_EMAIL);
if ($correo) {
// Generar token
$token = bin2hex(random_bytes(50));
$expira = date("Y-m-d H:i:s", strtotime("+1 hour"));
// Actualizar el token en la base de datos
$stmt = $conexion->prepare("UPDATE usuarios SET token = ?, expira_token = ? WHERE correo = ?");
$stmt->bind_param("sss", $token, $expira, $correo);
$stmt->execute();
if ($stmt->affected_rows > 0) {
$link = "https://tusitio.com/resetear.php?token=$token";
$asunto = "Recuperar tu contraseña";
$mensaje = "Haz clic en el siguiente enlace para resetear tu contraseña: $link";
$cabeceras = "From: no-responder@tusitio.com";
mail($correo, $asunto, $mensaje, $cabeceras);
echo "Correo enviado. Revisa tu bandeja de entrada.";
} else {
echo "Correo no encontrado.";
}
} else {
echo "Correo inválido.";
}
}
?>
📄 Paso 3: Crear el formulario de cambio de contraseña
resetear.php
<?php
$conexion = new mysqli("localhost", "usuario", "contraseña", "basededatos");
if (isset($_GET['token'])) {
$token = $_GET['token'];
$stmt = $conexion->prepare("SELECT id FROM usuarios WHERE token = ? AND expira_token > NOW()");
$stmt->bind_param("s", $token);
$stmt->execute();
$resultado = $stmt->get_result();
if ($resultado->num_rows > 0) {
?>
<form action="cambiar_contraseña.php" method="POST">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<label>Nueva contraseña:</label>
<input type="password" name="nueva_contraseña" required>
<input type="submit" value="Actualizar contraseña">
</form>
<?php
} else {
echo "Token inválido o expirado.";
}
}
?>
📄 Paso 4: Guardar la nueva contraseña
cambiar_contraseña.php
<?php
$conexion = new mysqli("localhost", "usuario", "contraseña", "basededatos");
if (isset($_POST['token']) && isset($_POST['nueva_contraseña'])) {
$token = $_POST['token'];
$nueva_contraseña = password_hash($_POST['nueva_contraseña'], PASSWORD_BCRYPT);
$stmt = $conexion->prepare("UPDATE usuarios SET contraseña = ?, token = NULL, expira_token = NULL WHERE token = ?");
$stmt->bind_param("ss", $nueva_contraseña, $token);
$stmt->execute();
if ($stmt->affected_rows > 0) {
echo "Contraseña actualizada exitosamente.";
} else {
echo "Error al actualizar la contraseña.";
}
}
?>
⚡ Consejos de seguridad:
- Usa
password_hash()ypassword_verify()para contraseñas. - Los tokens deben expirar en 1 hora o menos.
- No reveles información sensible al usuario si el correo no existe.