Autorização e Autenticação em PHP: do básico à segurança
No desenvolvimento web moderno, a autenticação (verificação da identidade do usuário) e a autorização (verificação de permissões de acesso) são mecanismos fundamentais de segurança. Em PHP, esses processos são implementados através do trabalho com sessões, cookies, hash de senhas e tokens. Neste artigo, abordaremos todos os aspectos essenciais necessários para criar um sistema de login seguro no site educacional pythonlib.ru.
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 (login + senha, biometria, token).
- Autorização — determinação de quais recursos e ações estão disponíveis para o usuário autenticado (funções: admin, moderador, usuário).
Em PHP, a autenticação geralmente é feita através de sessões ou JWT, e a autorização através da verificação de funções no banco de dados.
2. Hash de senhas: nunca armazene senhas em texto puro
O PHP fornece funções nativas para hash seguro de senhas. Use password_hash() e password_verify() — este é o padrão moderno.
// Registro de usuário$password = $_POST['password'];$hashedPassword = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// Salvamos $hashedPassword no BD$sql = "INSERT INTO users (email, password_hash) VALUES (?, ?)";$stmt = $pdo->prepare($sql);$stmt->execute([$_POST['email'], $hashedPassword]);// Verificação no login$inputPassword = $_POST['password'];$storedHash = $user['password_hash']; // do BD
if (password_verify($inputPassword, $storedHash)) { // Autenticação bem-sucedida $_SESSION['user_id'] = $user['id'];} else { // Senha incorreta}3. Gerenciamento de sessões em PHP
Sessões são a forma mais comum de rastrear usuários autenticados. O PHP gera automaticamente um identificador de sessão único e o armazena em um cookie.
// Início da sessão (sempre no início do script)session_start();
// Após login bem-sucedido$_SESSION['user_id'] = $user['id'];$_SESSION['user_role'] = $user['role']; // para autorização$_SESSION['logged_in'] = true;
// Verificação de autenticação em páginas protegidasfunction requireAuth() { if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { header('Location: /login.php'); exit; }}
// Logoutsession_destroy();setcookie(session_name(), '', time() - 3600, '/');4. Segurança de sessões: proteção contra ataques
Para prevenir sequestro de sessão (Session Hijacking) e fixação de sessão (Session Fixation), use as seguintes medidas:
- Regeneração do ID da sessão após o login:
session_regenerate_id(true); // remove a sessão antiga- Verificação de User-Agent e IP (opcional, mas aumenta a segurança):
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
// Em cada requisiçãoif ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) { session_destroy(); die('Atividade suspeita');}- Configuração de flags para o cookie de sessão no
php.iniou viasession_set_cookie_params():
session_set_cookie_params([ 'lifetime' => 0, // até fechar o navegador 'secure' => true, // apenas HTTPS 'httponly' => true, // inacessível via JavaScript 'samesite' => 'Strict' // proteção contra CSRF]);session_start();5. JWT (JSON Web Tokens)
Também na biblioteca
Geração de relatórios PDF em Rust: biblioteca printpdf
Event Bus e padrão Observer em Rust: implementação de arquitetura orientada a eventos
Autorização e Autenticação em Swift: guia completo para iOS/macOS
Trabalhando com YAML em Rust: biblioteca serde_yaml
Serialização de objetos em C++: bibliotecas e métodos