Como criar um sistema de recuperação de senha usando PHP e MySQL?
A recuperação de senha é uma funcionalidade essencial em sistemas de autenticação. O método mais seguro envolve tokens de redefinição, onde o usuário recebe um link temporário para redefinir sua senha.
Criando a Estrutura da Tabela no MySQL
Criamos uma tabela para armazenar os tokens de recuperação:
CREATE TABLE recuperacao_senha (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100) NOT NULL,
token VARCHAR(255) NOT NULL,
expiracao DATETIME NOT NULL
);
Gerando o Token e Enviando o E-mail
<?php
$conexao = new PDO("mysql:host=localhost;dbname=meu_banco", "usuario", "senha");
$email = $_POST['email'];
// Gerar token único
$token = bin2hex(random_bytes(50));
$expiracao = date("Y-m-d H:i:s", strtotime("+1 hour"));
// Salvar token no banco
$sql = "INSERT INTO recuperacao_senha (email, token, expiracao) VALUES (:email, :token, :expiracao)";
$stmt = $conexao->prepare($sql);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':token', $token);
$stmt->bindParam(':expiracao', $expiracao);
$stmt->execute();
// Enviar e-mail com link de recuperação
$link = "https://meusite.com/redefinir_senha.php?token=" . $token;
mail($email, "Recuperação de Senha", "Clique no link para redefinir sua senha: $link");
echo "E-mail de recuperação enviado!";
?>
Aqui:
- Geramos um token aleatório para identificar a solicitação.
- Salvamos o token no banco com uma data de expiração.
- Enviamos um e-mail ao usuário com o link para redefinição.
Criando a Página de Redefinição de Senha
<?php
if (isset($_GET['token'])) {
$conexao = new PDO("mysql:host=localhost;dbname=meu_banco", "usuario", "senha");
$token = $_GET['token'];
// Verificar se o token é válido e não expirou
$sql = "SELECT email FROM recuperacao_senha WHERE token = :token AND expiracao > NOW()";
$stmt = $conexao->prepare($sql);
$stmt->bindParam(':token', $token);
$stmt->execute();
$usuario = $stmt->fetch(PDO::FETCH_ASSOC);
if ($usuario) {
echo "<form method='post'>
<input type='hidden' name='email' value='" . $usuario['email'] . "'>
<label>Nova Senha:</label>
<input type='password' name='nova_senha'>
<button type='submit'>Redefinir</button>
</form>";
} else {
echo "Token inválido ou expirado!";
}
}
?>
Este código verifica o token e exibe um formulário para definir uma nova senha.
Por que utilizar tokens na recuperação de senha com PHP?
Sistemas de recuperação de senha são críticos para garantir a segurança de contas de usuários. Utilizar tokens temporários evita o armazenamento de senhas em e-mails e previne ataques de força bruta. Além disso, o uso de criptografia ao armazenar senhas melhora ainda mais a segurança.
Algumas aplicações:
- Sistemas de login seguros
- Recuperação de acesso a contas de e-commerce
- Autenticação de usuários em aplicações bancárias
- Plataformas de ensino online com gestão de contas
Dicas para quem está começando
- Utilize tokens aleatórios para dificultar ataques.
- Defina um tempo de expiração para tokens de recuperação.
- Evite armazenar senhas sem criptografia.
- Implemente um limite de tentativas para evitar abuso.
- Use HTTPS para proteger os links de redefinição.
Contribuições de Daniel Moreira