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