Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Los mejores trucos

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
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.

Última edición por navbuoy fecha: 20-10-2024 a las 01:44:23.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Alguna libreria para gestión de usuario y contraseña David PHP 0 01-04-2010 11:49:04
Hacer un post con usuario y contraseña gulder Varios 5 12-09-2008 19:08:21
Como hacer que mi aplicación acceda a la red sin que pida la contraseña al usuario Nbull Redes 8 02-02-2007 16:49:38
como puedo hacer para enviar un quick report por email?? merlin Internet 1 14-12-2003 20:24:17
como puedo hacer para enviar un quick report por email?? merlin Impresión 4 05-12-2003 18:06:58


La franja horaria es GMT +2. Ahora son las 11:29:54.


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
Copyright 1996-2007 Club Delphi