Autorização e Autenticação em PHP: do básico à segurança
A segurança de aplicações web começa com a implementação correta da autenticação (verificação da identidade do usuário) e da autorização (verificação de seus direitos de acesso). Em PHP, esses mecanismos podem ser implementados tanto com funções nativas quanto com bibliotecas especializadas. Neste artigo, abordaremos os conceitos-chave, escreveremos exemplos de código e analisaremos as melhores práticas de segurança.
1. Conceitos básicos: autenticação vs autorização
Antes de escrever código, é importante distinguir claramente os dois termos:
- Autenticação — processo de verificar se o usuário é quem diz ser (geralmente através de login e senha).
- Autorização — processo de determinar quais recursos ou ações estão disponíveis para um usuário autenticado (por exemplo, papel "admin" ou "user").
Erros na implementação de qualquer uma dessas etapas podem levar a vazamento de dados ou acesso não autorizado.
2. Autenticação básica via sessões (PHP nativo)
A forma mais comum é o uso de sessões. O PHP fornece o mecanismo embutido $_SESSION. Vejamos um exemplo simples.
Passo 1: Formulário de login (login.php)
<?phpsession_start();?><!DOCTYPE html><html><head> <title>Entrar no site</title></head><body> <form method="POST" action="login.php"> <label>Usuário:</label> <input type="text" name="username" required> <label>Senha:</label> <input type="password" name="password" required> <button type="submit" name="login">Entrar</button> </form></body></html>Passo 2: Processamento do login (mesmo login.php)
<?phpsession_start();require_once 'db.php'; // conexão com o BD
if (isset($_POST['login'])) { $username = trim($_POST['username']); $password = $_POST['password'];
// 1. Consulta preparada para proteção contra SQL injection $stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch();
// 2. Verificação da senha via password_verify if ($user && password_verify($password, $user['password_hash'])) { // Autenticação bem-sucedida $_SESSION['user_id'] = $user['id']; $_SESSION['logged_in'] = true; header("Location: dashboard.php"); exit; } else { $error = "Usuário ou senha inválidos"; }}?>Passo 3: Verificação de autorização na página protegida
<?phpsession_start();if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { header("Location: login.php"); exit;}// Acesso permitidoecho "Bem-vindo, usuário #" . htmlspecialchars($_SESSION['user_id']);?>3. Hash de senhas: nunca armazene senhas em texto puro
O PHP fornece funções seguras para trabalhar com senhas:
password_hash($password, PASSWORD_BCRYPT)— cria um hash com salt automaticamente.password_verify($password, $hash)— verifica a senha contra o hash.
Exemplo de registro de usuário:
<?php$password = "user123";$hash = password_hash($password, PASSWORD_BCRYPT);// Salvar $hash no banco de dados$stmt = $pdo->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)");$stmt->execute([$username, $hash]);?>Importante: nunca use md5() ou sha1() para senhas — eles estão obsoletos e são facilmente quebrados.
4. Autorização baseada em papéis (Role-Based Access Control)
Para diferenciar permissões
Também na biblioteca
Flipper para Kotlin: guia completo com exemplos práticos
Serialização de objetos em Java: guia completo com exemplos
Serialização de objetos em Swift (iOS/macOS): Codable, JSON e PropertyList
Cliente HTTP para Kotlin: Principais bibliotecas para trabalhar com rede