PHP Sessions: Um Guia Completo
Aprenda como as sessões PHP funcionam, como armazenar e recuperar dados de sessão e como protegê-las contra fixação e sequestro de sessão.
HTTP é sem estado — cada requisição que um navegador faz é independente, e o servidor esquece tudo assim que envia uma resposta. As sessões são a forma como o PHP lembra um visitante entre requisições: elas permitem manter um usuário autenticado, construir um carrinho de compras ou lembrar preferências enquanto o usuário navega de página em página. Este guia aborda o que são sessões, como funcionam internamente, como ler e gravar dados de sessão, e como mantê-las seguras.
O que são PHP Sessions?
Uma sessão PHP é um mecanismo para armazenar dados por usuário no lado do servidor durante a visita de um usuário. Ao contrário dos cookies, que armazenam dados no navegador, uma sessão mantém os dados reais no servidor e envia ao navegador apenas um pequeno ID de sessão para identificar quais dados pertencem a quem.
Isso importa por dois motivos:
- Capacidade — cookies são limitados a cerca de 4 KB e residem no navegador; os dados de sessão ficam no armazenamento do servidor (arquivos, banco de dados ou memória) e podem ser muito maiores.
- Segurança — valores sensíveis (o ID do usuário, papel ou conteúdo do carrinho) nunca saem do servidor, portanto o navegador não pode lê-los ou alterá-los. Apenas o ID de sessão opaco é exposto.
Como as PHP Sessions Funcionam?
Quando uma sessão é iniciada, o PHP gera um ID de sessão único para o visitante e o envia ao navegador em um cookie chamado PHPSESSID. Em cada requisição posterior, o navegador devolve esse cookie, e o PHP usa o ID para localizar os dados correspondentes armazenados no servidor. Os dados em si são expostos ao seu código como o array $_SESSION.
Fluxo de uma Sessão
graph LR
A[Browser] -- 1. Request + Session Cookie --> B[Server]
B -- 2. Validate Cookie & Fetch Data --> A
A -- 3. Receive Response --> BEm resumo: o cookie carrega o ID; o servidor guarda os dados.
Iniciando uma Sessão
Toda página que lê ou grava dados de sessão deve chamar session_start() antes de qualquer saída ser enviada ao navegador. Como session_start() envia o cookie PHPSESSID via cabeçalho HTTP, até mesmo um único espaço ou linha em branco antes da tag de abertura <?php acionará um aviso de "headers already sent" e quebrará a sessão.
Chamar session_start() retoma a sessão existente do visitante (se o navegador enviou um ID válido) ou inicia uma nova. Proteger a chamada com session_status() evita um aviso caso a sessão já tenha sido iniciada anteriormente na requisição:
Como iniciar uma sessão PHP
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}Lendo e Gravando Dados de Sessão
Uma vez iniciada a sessão, a superglobal $_SESSION se comporta como qualquer outro array associativo. Atribua a uma chave para armazenar um valor:
Armazenar dados em uma sessão PHP
<?php
$_SESSION['username'] = 'John Doe';
$_SESSION['cart'] = ['book', 'pen'];Leia de volta na mesma página ou em qualquer requisição posterior na mesma sessão:
Recuperar dados de uma sessão PHP
<?php
// Always check the key exists to avoid a warning
$username = $_SESSION['username'] ?? 'Guest';
echo "Welcome, {$username}";Como os dados persistem entre requisições, um padrão comum é um contador de visualizações de página que sobrevive a recarregamentos:
Contar visualizações de página na sessão atual
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
$_SESSION['views'] = ($_SESSION['views'] ?? 0) + 1;
echo "You have viewed this page {$_SESSION['views']} time(s).";Para remover um único valor, use unset() na sua chave — não atribua null, pois isso deixa a chave no lugar:
<?php
unset($_SESSION['cart']);Sessions vs. Cookies
Sessions e cookies frequentemente funcionam juntos, mas armazenam dados em lugares diferentes. Use uma sessão quando os dados são sensíveis ou grandes; use um cookie quando o próprio navegador precisa lembrar algo (como um token de "lembrar-me") entre visitas.
| Session | Cookie | |
|---|---|---|
| Armazenado em | Servidor | Navegador |
| Visível ao usuário | Não (apenas o ID) | Sim |
| Limite de tamanho | Grande (armazenamento do servidor) | ~4 KB |
| Tempo de vida | Até o navegador fechar ou expirar | Validade configurável |
Protegendo PHP Sessions
É importante proteger as sessões PHP para evitar acesso não autorizado a dados sensíveis do usuário. Você pode proteger suas sessões PHP de várias formas:
- Regenerar o ID de sessão periodicamente.
- Armazenar os dados de sessão no lado do servidor em um diretório seguro.
- Usar HTTPS para proteger a transmissão dos dados de sessão.
Regenerar o ID de sessão e reforçar o cookie
As opções de segurança devem ser definidas antes de session_start(), caso contrário o cookie já terá sido enviado com as configurações antigas. Regenerar o ID logo após uma mudança de privilégio (como um login) neutraliza ataques de fixação de sessão, em que um atacante induz a vítima a usar um ID de sessão que o atacante já conhece:
<?php
// Configure before the session starts
ini_set('session.cookie_secure', '1'); // send cookie over HTTPS only
ini_set('session.use_only_cookies', '1'); // never accept the ID from the URL
ini_set('session.cookie_httponly', '1'); // hide the cookie from JavaScript
session_start();
// After a successful login, swap the ID and discard the old one
session_regenerate_id(true);| Configuração | O que previne |
|---|---|
cookie_secure | Vazamento do ID de sessão por HTTP simples |
cookie_httponly | JavaScript (XSS) roubando o cookie |
use_only_cookies | IDs de sessão sendo passados nas URLs |
session_regenerate_id | Fixação de sessão após um login |
Encerrando uma PHP Session
Para deslogar um usuário, limpe os dados e destrua a sessão. Esvaziar $_SESSION remove as variáveis; session_destroy() descarta os dados no servidor; e excluir o cookie impede o navegador de enviar o ID obsoleto:
<?php
session_start();
// 1. Clear all session variables
$_SESSION = [];
// 2. Delete the session cookie in the browser
if (ini_get('session.use_cookies')) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
}
// 3. Destroy the data stored on the server
session_destroy();Conclusão
Em conclusão, as sessões PHP são uma ferramenta essencial para armazenar dados do usuário no lado do servidor e melhorar a experiência do usuário no seu site. Ao entender como funcionam e como utilizá-las, você pode aproveitar ao máximo os benefícios que oferecem. Com as medidas de segurança adequadas, você também pode garantir que os dados sensíveis dos usuários estejam protegidos.