W3docs

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 --> B

Em 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.

SessionCookie
Armazenado emServidorNavegador
Visível ao usuárioNão (apenas o ID)Sim
Limite de tamanhoGrande (armazenamento do servidor)~4 KB
Tempo de vidaAté o navegador fechar ou expirarValidade 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çãoO que previne
cookie_secureVazamento do ID de sessão por HTTP simples
cookie_httponlyJavaScript (XSS) roubando o cookie
use_only_cookiesIDs de sessão sendo passados nas URLs
session_regenerate_idFixaçã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.

Prática

Prática
O que pode ser realizado usando PHP sessions?
O que pode ser realizado usando PHP sessions?
Was this page helpful?