Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal!

 

Eu comecei com um desenvolvimento de sistema de escola em PHP. Eu decidir fazer esquema de login separado para administrador, professores e alunos. Eu inserir todos os usuários via phpMyAdmin, mas precisava que a senha ficasse hashada, ex: Q#%$#@% O código do index.php abaixo, o link do resto do código está abaixo.

 

<?php
session_start();
require 'includes/db.php';

ini_set('display_errors', 1);
error_reporting(E_ALL);

// Geração do CSRF token se não existir na sessão
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// Processamento do formulário de login
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Verificação do token CSRF
    if (empty($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die("Token CSRF inválido!");
    }

    // Coleta e sanitiza os dados do formulário
    $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
    $passwordInput = $_POST['password'];

    // Busca o usuário no banco de dados
    $stmt = $pdo->prepare("SELECT id, name, password, role FROM users WHERE email = ?");
    $stmt->execute([$email]);
    $user = $stmt->fetch();

    // Validação das credenciais
    if ($user && password_verify($passwordInput, $user['password'])) {
        // Sessão de usuário autenticado
        $_SESSION['user_id'] = $user['id'];
        $_SESSION['role'] = $user['role'];
        $_SESSION['name'] = $user['name'];

        // Redireciona para o painel do usuário
        header("Location: dashboard.php");
        exit;
    } else {
        $error = "Credenciais inválidas!";
    }
}

?>

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login - Escola</title>
</head>
<body>
    <h1>Login</h1>

    <!-- Exibe mensagem de erro -->
    <?php if (isset($error)) : ?>
        <p style="color: red;"><?= htmlspecialchars($error, ENT_QUOTES, 'UTF-8') ?></p>
    <?php endif; ?>

    <!-- Formulário de login -->
    <form method="POST" action="">
        <input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_token'], ENT_QUOTES, 'UTF-8') ?>">
        <label for="email">Email:</label>
        <input type="email" name="email" id="email" required><br>

        <label for="password">Senha:</label>
        <input type="password" name="password" id="password" required><br>

        <button type="submit">Entrar</button>
    </form>
</body>
</html>

 

Eu fiz todo o esquema pra converter, pelo código PHP, mas não conseguir. Alguém pode me ajudar, por favor?

 

Meu código completo com o Banco de Dados: https://github.com/AndersonBHBR/projeto-escola

  • Haha 1
Postado

Olá!
Execute:

<?php
echo password_hash('sua-senha', PASSWORD_BCRYPT);

pra ver qual vai ser a hash da senha que você precisa.
Ex.:

$password = $_POST['password'];

echo password_hash($password, PASSWORD_BCRYPT);

Saída: $2y$10$JEoiDGG9CuATsxpjgoAiqOLJg/XZzKLr5n7lt.nq7XyfTHh42zB.m

Dessa forma, vais poder usar essas hash no seu arquivo .sql


Percebi que está iniciando session em arquivos de views.
Não faça isso.
A responsabilidade das views é apenas exibir.

iniciar/encerrar sessões e conectar com database não são responsabilidades de uma view.

  • 2 semanas depois...
  • Moderador
Postado
6 horas atrás, Carlos FW Informatica disse:

para senha ficar hashada por que não cria um sistema de cadastro ao invés de inseri la no banco de dados?

Mas é exatamente assim que funciona um sistema de cadastro. Insere dos dados em um banco de dados.  E claro, para manter a segurança, é melhor usar a criptografia.  Base 64 por exemplo permite codificar e decodificar para verificação...  Mas pode usar SHA1  que é bem mais seguro... mas neste caso,  é necessário a comparação do hash gravado no banco de dados..

 

Por exemplo,  usando o base 64,  o sistema faz uma busca na tabela,  pega o hash gerado e descriptografa e compara com a senha digitada.     Já no Sha1 e MD5,  o sistema faz uma busca na tabela, pega o valor hash e compara com o valor hash gerado ao digitar a senha...  se ambos forem identicos, é verdadeiro.

  

 

  • Confuso 1
Postado
3 horas atrás, DiF disse:

Mas é exatamente assim que funciona um sistema de cadastro. Insere dos dados em um banco de dados.  E claro, para manter a segurança, é melhor usar a criptografia.  Base 64 por exemplo permite codificar e decodificar para verificação...  Mas pode usar SHA1  que é bem mais seguro... mas neste caso,  é necessário a comparação do hash gravado no banco de dados..

 

Por exemplo,  usando o base 64,  o sistema faz uma busca na tabela,  pega o hash gerado e descriptografa e compara com a senha digitada.     Já no Sha1 e MD5,  o sistema faz uma busca na tabela, pega o valor hash e compara com o valor hash gerado ao digitar a senha...  se ambos forem identicos, é verdadeiro.

  

 

 

MD5 e SHA1 não devem mais ser usados como hashes de senhas porque se vazar basta alguém reunir isso em um banco de dados. Só procurar por "MD5 Decrypt" ou "SHA1 Decrypt" no Google.

Além disso, o SHA1 já sofreu "ataque de colisão" há quase 20 anos, isso é, você consegue gerar o mesmo hash com conteúdos diferentes. MD5 pior ainda.

 

Base 64 não é algorítmo de criptografia, é apenas um método de codificação, que costuma ser útil quando você quer transportar dados binários por um meio que não suporta.

 

De qualquer modo, não é uma boa prática usar criptografia bidirecional para armazenar senhas. Você não deve ser capaz de descriptografá-las.

 

Para o PHP, o melhor método é justamente o do autor do tópico, usar o password_hash e o password_verify. O password_hash gera um hash com bcrypt com um salt único para cada geração. Isso significa que o mesmo conteúdo (ou a mesma senha) poderá ter hashes diferentes, impossibilitando a criação de uma "base de vazamento" como no caso do MD5 e SHA1. Ao mesmo tempo, seu algoritmo de hash consegue validar a senha sem precisar descriptografá-la, já que o processo é unidirecional.

  • Moderador
Postado

@Lord_Dracon O que eu comentei acima, foram meros exemplos.   Eu não conhecia estas funções. mencionadas.  Afinal estou fora da programação já fazem pelo menos uns 5 anos.   O que eu quis dizer, era para o outro usuário que senhas podem e devem ser armazenadas em um banco de dados  criptografadas.  Não disse que necessariamente deveriam ser usadas.  Até então só conhecia estes métodos. Se existe um melhor atualmente, com certeza deve ser usado.

  • Moderador
Postado

@Carlos FW Informatica  É que com a sua colocação deu a entender que não precisaria guardar os dados em um banco de dados.  Por isso mencionei que deveria sim, guardar os dados lá, com a senha criptografada.  Apenas isso.

 

O colega ali acima deu uma boa resposta sobre criptografia, que naqual eu desconhecia as funções. Futuramente, vou atualizar meus sistemas com as novas funções.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...