Article image
Weslley Ferraz
Weslley Ferraz20/11/2023 14:42
Compartilhe

Authenticação Segura com PHP puro

  • #PHP
  • #SQL

Neste tutorial, vamos explorar como criar um sistema de autenticação seguro usando PHP puro. Vamos dividir o processo em várias etapas, começando pela configuração do banco de dados e finalizando com a implementação do script de autenticação. vamos começar conectando o banco de dados criando o arquivo "conexao.php":

<?php
class Conexao
{
 private $servidor = "localhost";
 private $usuario = "root";
 private $senha = "";
 private $banco = "seu_banco_de_dados";


 public function conectar()
 {
     $coneccao = mysqli_connect($this->servidor, $this->usuario, $this->senha, $this->banco);


     if (mysqli_connect_errno()) {
         die("Falha ao abrir banco de dados: " . mysqli_connect_error());
     }


     mysqli_set_charset($coneccao, "utf8");


     return $coneccao;
 }
}

Na primeira parte, criamos uma classe de conexão para estabelecer uma conexão segura com o banco de dados. Esta classe contém detalhes de conexão e um método para iniciar a conexão.

Criei este arquivo de conexão dentro da pasta "db", onde também criei o arquivo "migrations.php":

<?php
include_once "conexao.php";

class Migration
{
 private $conexao;

 public function __construct()
 {
     $conexaoDB = new Conexao();
     $this->conexao = $conexaoDB->conectar();
 }

 public function criarTabelaUsuarios()
 {
     $sql = "

     CREATE TABLE IF NOT EXISTS usuarios (
         id_usuario int(11) NOT NULL,
         id_imagem int(11) DEFAULT NULL,
         nome VARCHAR(255) NOT NULL,
         email VARCHAR(255) NOT NULL,
         nivel VARCHAR(255) NOT NULL,
         telefone VARCHAR(255) NOT NULL,
         senha VARCHAR(300) NOT NULL,
         dataCriacao DATE,
         dataMudanca DATE
     );
     ";

     if ($this->conexao->query($sql) === true) {
         echo "Tabela 'usuarios' criada com sucesso!";
     } else {
         echo "Erro ao criar tabela de usuarios: " . $this->conexao->error;
     }
 }
}

Na segunda parte, usamos uma classe de migração para criar a tabela de usuários no banco de dados. Isso facilita a manutenção e atualização do banco de dados. A qual eu chamo no arquivo "index.php" na raiz do projeto:

<?php
include_once "db/migrations.php";
$migration = new Migration();

$migration->criarTabelaUsuarios();

echo "<script language='javascript'>window.location='views/inicio.php'; </script>";

Eu faço isso, para que sempre exista essa tabela. Mas vamos voltar ao assunto principal, a autenticação que é um arquivo chamado "autenticar.php" que está situado na pasta "controllers":

<?php
// Inicia a sessão para utilizar variáveis de sessão
session_start();

// Inclui o arquivo de conexão ao banco de dados
include_once "../db/conexao.php";

// Inclui o arquivo do repositório de usuário
include_once "../repositorios/usuarioRepositorio.php";

// Cria uma instância da classe de conexão
$c = new Conexao();
$conexao = $c->conectar();

// Define um limite para tentativas de login malsucedidas
$limiteTentativas = 3;

// Verifica se a variável de sessão para tentativas existe
if (!isset($_SESSION['tentativas'])) {
 $_SESSION['tentativas'] = 0;
}

// Verifica se o usuário está bloqueado
if (isset($_SESSION['bloqueio']) && $_SESSION['bloqueio'] > time()) {
 // Calcula o tempo restante de bloqueio
 $tempoRestante = $_SESSION['bloqueio'] - time();
 $mensagem = "Usuário bloqueado, tente novamente em " . gmdate("H:i:s", $tempoRestante);

 // Exibe uma mensagem de alerta e redireciona para a página de login
 echo "<script language='javascript'>window.alert('$mensagem'); </script>";
 echo "<script language='javascript'>window.location='../views/login.php'; </script>";

 // Encerra a execução do script
 exit();
}

// Verifica se as informações de usuário e senha foram submetidas via POST
if (isset($_POST['usuario'], $_POST['senha'])) {
 // Obtém e sanitiza os dados de usuário e senha
 $email = mysqli_real_escape_string($conexao, strtolower($_POST['usuario']));
 $senha = mysqli_real_escape_string($conexao, $_POST['senha']);

 // Prepara a consulta SQL para buscar o usuário no banco de dados
 $consulta = "SELECT id_usuario, email, nome, id_fil, nivel, senha FROM usuarios WHERE email = ?";
 $stmt = mysqli_prepare($conexao, $consulta);
 mysqli_stmt_bind_param($stmt, "s", $email);
 mysqli_stmt_execute($stmt);
 $resultado = mysqli_stmt_get_result($stmt);

 // Verifica se a consulta foi bem-sucedida e se a senha é válida
 if ($resultado && $dado = mysqli_fetch_array($resultado)) {
     if (password_verify($senha, $dado["senha"])) {
         // Define as variáveis de sessão após o login bem-sucedido
         $_SESSION['id_usuario'] = $dado['id_usuario'];
         $_SESSION['email'] = $email;
         $_SESSION['nome'] = $dado['nome'];
         $_SESSION['id_fil'] = $dado['id_fil'];
         $_SESSION['nivel'] = $dado['nivel'];

         // Redireciona para a página de perfil após o login
         echo "<script language='javascript'>window.location='../views/perfil.php'; </script>";
         exit();
     }
 }

 // Incrementa o contador de tentativas
 $_SESSION['tentativas']++;

 // Verifica se o limite de tentativas foi atingido
 if ($_SESSION['tentativas'] >= $limiteTentativas) {
     // Bloqueia o usuário por 1 hora a partir deste momento
     $_SESSION['bloqueio'] = time() + 3600;
 }
}

// Se o login falhar, redirecione de volta para a página de login com uma mensagem de erro
echo "<script language='javascript'>window.alert('Erro'); </script>";
echo "<script language='javascript'>window.location='../views/login.php'; </script>";
exit();
?>

A terceira parte abrange o script de autenticação, que verifica as credenciais do usuário e realiza o login seguro. Agora é só criar o formulário que envia os dados para esse arquivo php

Mais sobre o autor Weslley Henrique Vieira Ferraz clicando aqui

Compartilhe
Comentários (0)