Sistema de Recuperación de Contraseña con Correo en PHP (Sin Frameworks)

Comparte

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() y password_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.




codigo fuente gratis