CRIPTOGRAFIA DE SENHA - USUÁRIO INVÁLIDO

MySQL

PHP

PDO

01/02/2023

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>
Edilson Santiago

Edilson Santiago

Curtidas 0

Respostas

Arthur Heinrich

Arthur Heinrich

01/02/2023

$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']) {


A variável $dados['senha'] não está criptografada, mas a variável $row_usuario['senha'], que veio da tabela está. Por isso não bate.

Troque para:

            if(password_hash($dados['senha'], PASSWORD_BCRYPT,['cost=>12']) == $row_usuario['senha']) {

GOSTEI 0
Edilson Santiago

Edilson Santiago

01/02/2023

$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']) {


A variável $dados['senha'] não está criptografada, mas a variável $row_usuario['senha'], que veio da tabela está. Por isso não bate.

Troque para:

            if(password_hash($dados['senha'], PASSWORD_BCRYPT,['cost=>12']) == $row_usuario['senha']) {



Fiz como vc me orientou, mas o erro continua.
GOSTEI 0
POSTAR