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

CRIPTOGRAFIA DE SENHA - USUÁRIO INVÁLIDO


mm_edilson

Pergunta

Boa tarde, amigos. Estou criando um sisteminha simples de login. Consigo cadastrar o usuário, e tudo funciona salvando a senha crua no banco de dados. Mas quando tento usar hash para criptografar, ela salva criptografada no BD, mas na hora do login, dá senha inváilda. Alguém pode me ajudar com os códigos?

 

Página inserir novo usuário:

<?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>Cadastro de Usuário</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">

        <h2>Cadastro</h2>
        Por favor, preencha todos os dados para criar um novo usuário.<br><br>
        <?php 
        $dados = filter_input_array(INPUT_POST, FILTER_DEFAULT);
        
        if (!empty($dados['CadUsuario'])) {
           var_dump($dados['senha']);
            $query_usuario = "INSERT INTO usuario (nome, email, senha, situacoe_id, niveis_acesso_id, created, modified) VALUES (:nome, :email, :senha, :situacoe_id, :niveis_acesso_id, :created, :modified)";
            $cad_usuario = $conn->prepare($query_usuario);
            $cad_usuario->bindParam(':nome', $dados['nome'], PDO::PARAM_STR);
            $cad_usuario->bindParam(':email', $dados['email'], PDO::PARAM_STR);
            $cad_usuario->bindParam(':senha', password_hash($dados['senha'], PASSWORD_BCRYPT,['cost=>12']));
            $cad_usuario->bindParam(':situacoe_id', $dados['situacoe_id'], PDO::PARAM_STR);
            $cad_usuario->bindParam(':niveis_acesso_id', $dados['niveis_acesso_id'], PDO::PARAM_STR);
            $cad_usuario->bindParam(':created', $dados['created'], PDO::PARAM_STR);
            $cad_usuario->bindParam(':modified', $dados['modified'], PDO::PARAM_STR);
            $cad_usuario->execute();
            if($cad_usuario->rowCount()){
                echo "<p style='color: green;'>Usuário cadastrado com sucesso!</p>";
            }else{
                
                echo "<p style='color: #ff0000;'>Erro ao cadastrar usuário!</p>";
        }}
        ?>
        
        
        
        <form name="cad_usu" class="form" method="POST" action="">
            <input class="field" name="nome" placeholder="Nome" required>
            <input class="field" type="email" name="email" placeholder="E-mail" required>
            <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 type="hidden" name="situacoe_id" value="1">
            <input type="hidden" name="niveis_acesso_id" value="1">
            <input type="hidden" name="created" value='<?php echo date("Y-m-d H:i:s"); ?>'>
            <input type="hidden" name="modified" value='<?php echo date("Y-m-d H:i:s"); ?>'>
            <input class="field2" type="submit" name="CadUsuario" value="Cadastrar Usuário">
            <input class="field2" type="reset" value="Limpar Formulário">
            
        </form>
        </div>
        
    </section>
     </div>   
</body>
</html>

 

Código de login:

<?php
session_start();
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>Cadastro de Usuário</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>
        <?php 
        $dados = filter_input_array(INPUT_POST,FILTER_DEFAULT);
        if(!empty($dados['SendLogin'])){
          $query_usuario = "SELECT id, nome, email, senha 
          FROM usuario 
          WHERE email =:email AND senha =:senha
          LIMIT 1";  
          $result_usuario = $conn->prepare($query_usuario);
          $result_usuario->bindParam(':email', $dados['email']);
          $result_usuario->bindParam(':senha', password_hash($dados['senha'], PASSWORD_BCRYPT,['cost=>12']));
          $result_usuario->execute();
          
          if(($result_usuario) AND ($result_usuario->rowCount() !=0)){
            $row_usuario = $result_usuario->fetch(PDO::FETCH_ASSOC);
            if($dados['senha'] == $row_usuario['senha']) {
                $_SESSION['id'] = $row_usuario['id'];
                $_SESSION['nome'] = $row_usuario['nome']; 
                header("Location: painel.php");
            }else{
                $_SESSION['msg'] = "<p style='color: red'>Erro: Usuário e/ou senha inválidos!</p>";
            }
          }else{
              $_SESSION['msg'] = "<p style='color: red'>Erro: Usuário e/ou senha inválidos!</p>";
          }
          
          
        }
        
        if(isset($_SESSION['msg'])){
            echo $_SESSION['msg'];
            unset($_SESSION['msg']);
        }
        ?>
        
        <form name="cad_usu" class="form" method="POST" action="">
            <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">
            
        </form>
        </div>
        
    </section>
     </div>   
</body>
</html>

 

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Eu não sou especialista no PDO, mas acredito que você não pode usar função dentro do bindParam. Eu fiz o meu teste assim:

<?php
$conn=new PDO("mysql:host=localhost;dbname=astudy","root","");
$query_usuario = "INSERT INTO usuario (nome,email,senha)
 	VALUES (:nome,:email,:senha)";
$cad_usuario = $conn->prepare($query_usuario);
$dados['nome']="frank";
$dados['email']="frankhosaka@gmail.com";
$dados['senha']="1234";
$senha=password_hash($dados['senha'],PASSWORD_BCRYPT,['cost=>12']);
$cad_usuario->bindParam(':nome',$dados['nome'],PDO::PARAM_STR);
$cad_usuario->bindParam(':email',$dados['email'],PDO::PARAM_STR);
$cad_usuario->bindParam(':senha',$senha);
$cad_usuario->execute();
if($cad_usuario->rowCount()){
    echo "<p style='color: green;'>Usuário cadastrado com sucesso!</p>";}else{
		echo "não deu!";}

Apesar do teste dar certo, acredito que o terceiro parâmetro do password_hash está em desacordo com o que vi no Google, o pessoal escreve assim: ['cost'=>12]

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0

Eu mudei o código do login, linhas 43 e 46, mas não deu certo.

  if(($result_usuario) AND ($result_usuario->rowCount() !=0)){
            $row_usuario = $result_usuario->fetch(PDO::FETCH_ASSOC);
            $senha=password_hash($dados['senha'], PASSWORD_BCRYPT,['cost=>12']);
            if($senha == $row_usuario['senha']) {

Eu fiz uma bateria de teste e percebi que esse password_hash sempre gera uma senha diferente, logo nenhum usuário poderá entrar no sistema. Vou estudar essa função. Aconselho a fazer o mesmo, boa sorte.

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz várias modificações para o código do login funcionar:

1) verifique no MySQL se o campo senha foi definido como VARCHAR(255), se não estiver, aconselho a eliminar todos os registros, para cadastrar as novas contas pela tela de cadastro (outra vez eu repito, eu recebi a mensagem de erro ao usar a função password_hash dentro da instrução bindParam, você tem que definir antes assim $hash=password_hash(etc), e depois
$cad_usuario->bindParam(':senha',$hash); bem como usar o parametro ['cost'=>12] na função. Do seu jeito funciona, mas isso não quer dizer que está certo.

2) você não pode usar a função password_hash na rotina do login

3) você só pode usar a função password_verify na rotina do login

4) o formulário <form> tem que vir antes e não depois da rotina de validação.

Segue o código (nele eu precisei criar a variável $conn para testar e tirar a instrução include)

 

<!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="current-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">
        </form>
</div>
</section>
<?php
if(!isset($_POST['SendLogin'])){exit;}
$conn=new PDO("mysql:host=localhost;dbname=astudy","root","");
$dados = filter_input_array(INPUT_POST,FILTER_DEFAULT); 
$query_usuario = "SELECT email, senha 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']; 
        header("Location: painel.php");} else {
        echo "<div class=content><p style='color: red'>
			Erro: Usuário e/ou senha inválidos!</p>";}      
?>
</body>
</html>

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

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...