Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Truco PHP, como hacer para restablecer una contraseña con hash y un email de usuario (https://www.clubdelphi.com/foros/showthread.php?t=96908)

navbuoy 20-10-2024 01:35:35

Truco PHP, como hacer para restablecer una contraseña con hash y un email de usuario
 
Para implementar una funcionalidad de restablecimiento de contraseña en PHP con SHA-256, puedes seguir estos pasos básicos. Aquí te doy una solución que genera un enlace temporal para restablecer la contraseña y lo envía al correo del usuario. El enlace tendrá un token único y una expiración que puedes ajustar.

1. Agregar un campo de token de restablecimiento y su fecha de expiración en la base de datos
Tendrás que añadir dos columnas en tu tabla de usuarios para almacenar el token de restablecimiento de contraseña y su fecha de expiración:

Código SQL [-]
ALTER TABLE usuarios ADD reset_token VARCHAR(64), ADD reset_token_expiration DATETIME;

2. Generar el token de restablecimiento de contraseña
En el archivo PHP que maneje la solicitud de restablecimiento de contraseña, deberás generar un token único y guardarlo en la base de datos junto con su fecha de expiración (por ejemplo, 1 hora desde su creación).

Código PHP:

<?php
function generateResetToken($email) {
    
// Conectarse a la base de datos
    
$conn = new mysqli("host""usuario""password""basedatos");

    
// Verificar si el usuario existe
    
$stmt $conn->prepare("SELECT * FROM usuarios WHERE email = ?");
    
$stmt->bind_param("s"$email);
    
$stmt->execute();
    
$result $stmt->get_result();

    if (
$result->num_rows == 1) {
        
// Generar el token
        
$token bin2hex(random_bytes(32));  // Token de 64 caracteres (32 bytes)
        
$token_expiration date('Y-m-d H:i:s'strtotime('+1 hour'));  // Expira en 1 hora
        
        // Guardar el token y la fecha de expiración en la base de datos
        
$stmt $conn->prepare("UPDATE usuarios SET reset_token = ?, reset_token_expiration = ? WHERE email = ?");
        
$stmt->bind_param("sss"$token$token_expiration$email);
        
$stmt->execute();
        
        
// Enviar el enlace por correo electrónico
        
$reset_link "https://tudominio.com/reset_password.php?token=$token";
        
$subject "Restablecer tu contraseña";
        
$message "Haz clic en el siguiente enlace para restablecer tu contraseña: $reset_link. Este enlace es válido por 1 hora.";
        
$headers "From: no-reply@tudominio.com";

        
mail($email$subject$message$headers);
        
        echo 
"Se ha enviado un enlace de restablecimiento de contraseña a tu correo.";
    } else {
        echo 
"El email no existe en nuestra base de datos.";
    }
}
?>

3. Crear el formulario de restablecimiento de contraseña
Cuando el usuario haga clic en el enlace del correo, redirígelo a una página de restablecimiento de contraseña (reset_password.php), donde se verificará el token y se permitirá ingresar una nueva contraseña.

Código PHP:

<?php
// reset_password.php
if (isset($_GET['token'])) {
    
$token $_GET['token'];

    
// Conectarse a la base de datos
    
$conn = new mysqli("host""usuario""password""basedatos");

    
// Verificar si el token es válido y si no ha expirado
    
$stmt $conn->prepare("SELECT * FROM usuarios WHERE reset_token = ? AND reset_token_expiration > NOW()");
    
$stmt->bind_param("s"$token);
    
$stmt->execute();
    
$result $stmt->get_result();

    if (
$result->num_rows == 1) {
        if (isset(
$_POST['new_password'])) {
            
$new_password hash('sha256'$_POST['new_password']);  // Hashear la nueva contraseña
            
            // Actualizar la contraseña en la base de datos
            
$stmt $conn->prepare("UPDATE usuarios SET password = ?, reset_token = NULL, reset_token_expiration = NULL WHERE reset_token = ?");
            
$stmt->bind_param("ss"$new_password$token);
            
$stmt->execute();
            
            echo 
"Tu contraseña ha sido restablecida con éxito.";
        }
    } else {
        echo 
"El token es inválido o ha expirado.";
    }
}
?>

4. Formulario HTML para el restablecimiento
Este formulario aparecerá cuando el usuario acceda al enlace de restablecimiento de contraseña.

Código:

<form method="POST" action="">
    <label for="new_password">Nueva contraseña:</label>
    <input type="password" id="new_password" name="new_password" required>
    <button type="submit">Restablecer contraseña</button>
</form>

5. Consideraciones de seguridad
HTTPS: Asegúrate de que el enlace de restablecimiento de contraseña se envíe a través de HTTPS para proteger la información.

Expiración del token: Asegúrate de que el token expire después de un tiempo razonable (como 1 hora).

Invalidar el token después del uso: Una vez que el usuario ha restablecido la contraseña, el token debe ser eliminado o invalidado.

Longitud del token: Utiliza tokens largos y aleatorios para reducir la posibilidad de ataques de fuerza bruta.

Este flujo permite que un usuario restablezca su contraseña de manera segura, utilizando un enlace enviado a su correo electrónico y que expira después de un período determinado.

Tambien daos cuenta que podriamos por ejemplo, tener un TEdgeBrowser en nuestra app C++ Builder o Delphi y tener integrado el sistema en algun Form que mostremos con las paginas del servidor php teniendo de esa forma integrado en cierta manera el sistema de restablecimiento de la contraseña desde la propia app sin tener que ir al Navegador, o incluso hacer alguna funcion que haga las comunicaciones de manera oculta simplemente utilizando (copy paste) el TOKEN en algunos controles del Form y comunicarnos con el php de forma "invisible" o bien mostrando en el TBrowser/TEdge (componente Navegador en Rad Studio) los formularios para cambiarla.

O hacer todo el "deal" de MySQL con componentes de acceso a BD y que unicamente tengas que pegar el TOKEN que recibiste en tu correo y tenerlo todo cuco en un mini_Form en la app.


La franja horaria es GMT +2. Ahora son las 11:16:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi