Ir para conteúdo
Fórum Script Brasil
  • 0

Alteração de Senha só funciona depois que fecha o navegador e abre novamente


mm_edilson

Pergunta

Colegas, boa tarde. Estou criando um sisteminha de login, e estou na parte de recuperação de senha. Escrevi o código para o usuário digitar o e-mail cadastrado e solicitar a redefinição. Então, ele recebe um link único no e-mail dele e, por meio desse link, abre a página de criar nova senha. 

Tudo funciona. O cadastro, o login, e a alteração de senha. Exceto por um problema. Quando faço uma recuperação de senha, e retorno para a página de login, ele dá a nova senha como inválida. Aí, se eu fechar o navegador e abrir de novo, e digitar a nova senha, ele entra normalmente. E não funciona ctrl+F5. Tem que fechar e abrir.

Não faço ideia do que pode estar causando isso. 

Vou postar meu código:

Página de Login:

<?php

include_once 'connect.php';
?>

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content-"width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Login</title>
    <style>
        body{font-family: Arial, Helvetica, sans-serif}
        .content{display:flex;justify-content: center}
        .contato{width:100%; max-width: 500px;}
        .form{display: flex; flex-direction: column}
        .field{padding:10px; margin-bottom:15px; border:1px solid #DDD; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px}
        .field2{padding:10px; margin-bottom:15px; border:1px solid #ADD8E6; background-color:#ADD8E6; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px}
        .field2:hover{padding:10px; margin-bottom:15px; border:1px solid #87CEFA; background-color:#87CEFA;  border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px; font-weight:bold;}
    </style>

</head>
<body>
<section class="content">
<div class="contato">
        <h2>Login</h2>
        Por favor, entre com o e-mail e a senha cadastrados.<br><br>
        <form name="cad_usu" class="form" method=post>
        <input class="field" type="email" name="email" 
               placeholder="E-mail" required>
        <input class="field" type="password" 
               name="senha" placeholder="Senha" required>
        <input class="field2" type="submit" name="SendLogin" 
               value="Entrar no Sistema">
        <input class="field2" type="reset" value="Limpar Formulário">
        <center><a href="recuperar_senha.php"><font size="2">Esqueci a senha</font></a></center>
        </form>
</div>
</section>
<?php
if(!isset($_POST['SendLogin'])){exit;}
$dados = filter_input_array(INPUT_POST,FILTER_DEFAULT); 
$query_usuario = "SELECT * FROM usuario WHERE 
	email =:email LIMIT 1";  
$result_usuario = $conn->prepare($query_usuario);
$result_usuario->bindParam(':email', $dados['email']);
$result_usuario->execute();

$row_usuario = $result_usuario->fetch(PDO::FETCH_ASSOC);
if($row_usuario && (password_verify($dados['senha'], $row_usuario['senha']))) { 
        $_SESSION['id'] = $row_usuario['id'];
        $_SESSION['nome'] = $row_usuario['nome'];
        $_SESSION['situacoe_id'] = $row_usuario['situacoe_id'];
        $_SESSION['niveis_acesso_id'] = $row_usuario['niveis_acesso_id'];
        header("Location: painel.php");} else {
        echo "<div class=content><p style='color: red'>
			Erro: Usuário e/ou senha inválidos!</p>";}      
?>
</body>
</html>

 

Página de Recuperação de Senha:

<?php
include_once 'connect.php';
?>

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content-"width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Recuperação de Senha</title>
    <style>
        body{font-family: Arial, Helvetica, sans-serif}
        .content{display:flex;justify-content: center}
        .contato{width:100%; max-width: 500px;}
        .form{display: flex; flex-direction: column}
        .field{padding:10px; margin-bottom:15px; border:1px solid #DDD; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px}
        .field2{padding:10px; margin-bottom:15px; border:1px solid #ADD8E6; background-color:#ADD8E6; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px}
        .field2:hover{padding:10px; margin-bottom:15px; border:1px solid #87CEFA; background-color:#87CEFA;  border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px; font-weight:bold;}
    </style>
<script>
 function confereSenha(){
     const senha = document.querySelector('input[name=senha]');
     const confirma_senha = document.querySelector('input[name=confirma_senha');
     
     if (confirma_senha.value === senha.value) {
         confirma_senha.setCustomValidity('');
     } else {
         confirma_senha.setCustomValidity('As senhas digitadas não conferem! Elas precisam ser iguais.');
     }
     
 }
</script>

</head>
<body>
    
<section class="content">
<div class="contato">
        <center><h2>Recuperação de Senha</h2></center>
        <br><br>

<?php

$user = $_GET['utilizador'];
$hash = $_GET['confirmacao'];

$query_recupera = "SELECT * FROM recuperacao";  
$result_recupera = $conn->prepare($query_recupera);
$result_recupera->execute();
$row_recupera = $result_recupera->fetch(PDO::FETCH_ASSOC);
$user_cadastrado = $row_recupera['email_usu'];
$hash_cadastrado = $row_recupera['confirmacao'];

$query_usuario = "SELECT * FROM usuario WHERE email = '$user'";
$result_usuario = $conn->prepare($query_usuario);
$result_usuario->execute();
$row_usuario = $result_usuario->fetch(PDO::FETCH_ASSOC);
$id_user = $row_usuario['id'];
$modified = date('Y-m-d H:i:s');
echo $id_user;

if(!empty($_POST)){

    if($user == $user_cadastrado && $hash == $hash_cadastrado){
    
    $dados = filter_input_array(INPUT_POST, FILTER_DEFAULT);    
    $sql = "UPDATE usuario SET senha =:senha, modified =:modified WHERE id =:id";
    $statement = $conn->prepare($sql);
    $statement->bindParam(':senha', password_hash($dados['senha'], PASSWORD_DEFAULT));
    $statement->bindParam(':modified', $modified);
    $statement->bindParam(':id', $id_user);
        if($statement->execute()){
            echo "<p style='color: green;'>Senha alterada com sucesso!</p>";
            echo "<p><a href='login.php'>Voltar ao Login></a></p>";
            
        } else {
            
        echo "<p style='color: red;'>Erro! Não foi possível alterar sua senha. Por favor, entre em contato com o administrador do sistema.</p>";
    
        }
    
    } else {
    echo "<p style='color: red;'>Erro! Não foi possível alterar sua senha. Por favor, entre em contato com o administrador do sistema.</p>";
    }


} else {
    echo "";
}

    
    
  ?>
        
        
        
        <form name="cad_usu" class="form" method="POST" action="">
            <input class="field" type="password" name="senha" placeholder="Senha" required onchange='confereSenha();'>
            <input class="field" type="password" name="confirma_senha" placeholder="Confirmar Senha" required onchange='confereSenha();'>
            <input class="field2" type="submit" name="AlteraSenha" value="Alterar Senha">
            <input class="field2" type="reset" value="Limpar Formulário">
            
        </form>
        </div>
        
 
    </section>
     </div>  
   
</body>
</html>

 

E por fim, a página que abre quando clico no link recebido pelo e-mail:

<?php
include_once 'connect.php';
?>

<html>
    <meta charset="UTF-8">
    <meta name="viewport" content-"width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Login</title>
    <style>
        body{font-family: Arial, Helvetica, sans-serif}
        .content{display:flex;justify-content: center}
        .contato{width:100%; max-width: 500px;}
        .form{display: flex; flex-direction: column}
        .field{padding:10px; margin-bottom:15px; border:1px solid #DDD; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px}
        .field2{padding:10px; margin-bottom:15px; border:1px solid #ADD8E6; background-color:#ADD8E6; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px}
        .field2:hover{padding:10px; margin-bottom:15px; border:1px solid #87CEFA; background-color:#87CEFA;  border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px; font-weight:bold;}
    </style>

</head>
    <body>
<section class="content">
<div class="contato">
        <h2>Recuperação de Senha</h2>
        Por favor, digite o e-mail cadastrado.<br><br>
        <form name="cad_usu" class="form" method=post>
        <input class="field" type="email" name="email_usu" 
               placeholder="E-mail" required>
        <input class="field2" type="submit" name="Recuperar" 
               value="Recuperar Senha">
        <center><a href="login.php"><font size="2">Voltar ao Login</font></a></center>
        </form>
</div>
</section>
<?php

if(!isset($_POST['Recuperar'])){exit;}
$dados = filter_input_array(INPUT_POST,FILTER_DEFAULT); 
$query_usuario = "SELECT email FROM usuario WHERE 
	email =:email LIMIT 1";  
$result_usuario = $conn->prepare($query_usuario);
$result_usuario->bindParam(':email', $dados['email_usu']);
$result_usuario->execute();

$row_usuario = $result_usuario->fetch(PDO::FETCH_ASSOC);
if($row_usuario) { 
//se o e-mail for localizado, acontece isso:
//gera a chave de confirmação

$utilizador = $dados['email_usu'];
$chave = sha1(uniqid( mt_rand(), true));

//salva a chave no banco de dados

$query_salva_usu = "INSERT INTO recuperacao (email_usu, confirmacao) VALUES (:email_usu, :confirmacao)";
            $salva_usu = $conn->prepare($query_salva_usu);
            $salva_usu->bindParam(':email_usu', $dados['email_usu'], PDO::PARAM_STR);
            $salva_usu->bindParam(':confirmacao', $chave, PDO::PARAM_STR);
            $salva_usu->execute();
             if($salva_usu->rowCount()){
                 $link = "http://www.sgi.dev.br/recuperar.php?utilizador=$utilizador&confirmacao=$chave";
                 
                 if(mail($utilizador, 'Recuperação de Senha', 'Olá, '.$utilizador.'. Recebemos uma solicitação de recuperação de senha do site SGI - Sistema de Gestão de Igrejas. Se foi você, por favor, clique no link a seguir e crie uma nova senha: '.$link.' Se você não se lembra de ter solicitado essa alteração, por favor, desconsidere este e-mail. '))
                 
                echo "<center><p style='color: green;'>Um link de confirmação foi enviado para '.$utilizador.'. <br>Por favor, abra-o e confirme sua solicitação. Se não o encontrar na caixa de entrada, gentileza verificar a caixa de spam.</center></p>";
    

             }else{
                
                 echo "<p style='color: #ff0000;'>Erro. Não foi possível recuperar a senha. Entre em contato com o administrador do sistema!</p>";
        }

} else {
//se o e-mail não for localizado, acontece isso:


        echo "<div class=content><p style='color: red'>
			Erro: email não encontrado!</p>";    

  }
?> 

</body>
</html>

 

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...