Sessões
Esta aula aborda o uso de sessões em PHP, explicando como iniciar, manipular e encerrar sessões, além de discutir o ciclo de vida e boas práticas de segurança. Ao final, você será capaz de gerenciar dados persistentes entre requisições HTTP de forma segura.
Sessões são um mecanismo fundamental em PHP para manter dados do usuário entre diferentes requisições HTTP. Como o HTTP é um protocolo sem estado, as sessões permitem associar informações a um visitante específico, como login, preferências ou itens de carrinho de compras. Nesta aula, exploraremos desde a inicialização até a destruição de sessões, passando por boas práticas de segurança.
Entender o funcionamento das sessões é essencial para construir aplicações web interativas e personalizadas. Vamos mergulhar nos detalhes de session_start, na superglobal $_SESSION, no ciclo de vida da sessão e nas principais medidas de segurança.
session_start
A função session_start() inicia uma nova sessão ou retoma uma sessão existente baseada em um identificador de sessão enviado via cookie ou parâmetro GET/POST. Ela deve ser chamada antes de qualquer saída no script, caso contrário, um aviso será emitido e a sessão pode não funcionar corretamente. É comum colocá-la no início de cada página que utiliza sessões.
Quando chamada, o PHP verifica se existe um cookie de sessão (por padrão chamado PHPSESSID) enviado pelo cliente. Se existir, a sessão correspondente é carregada; caso contrário, uma nova sessão é criada e um novo cookie é enviado ao navegador.
É importante notar que session_start() retorna true se a sessão foi iniciada com sucesso e false caso contrário. Você pode verificar o retorno para depuração.
$_SESSION
A superglobal $_SESSION é um array associativo que contém os dados da sessão atual. Ela só está disponível após a chamada de session_start(). Você pode adicionar, modificar ou remover elementos como em qualquer array PHP.
Exemplo prático de uso:
Lembre-se de que session_unset() limpa os dados, mas mantém a sessão ativa. Para destruir completamente a sessão, use session_destroy().
Ciclo de vida
O ciclo de vida de uma sessão PHP começa com a primeira chamada a session_start() e termina quando a sessão é destruída ou expira. A sessão é identificada por um ID único (SID) que geralmente é armazenado em um cookie no navegador do cliente. Esse ID é enviado de volta ao servidor em cada requisição, permitindo que o PHP recupere os dados associados.
A sessão persiste até que:
- O usuário feche o navegador (se o cookie for de sessão, ou seja, sem tempo de vida definido).
- O tempo de vida configurado no PHP (por exemplo,
session.gc_maxlifetime) expire, fazendo com que o garbage collector remova sessões antigas. - O script chame
session_destroy()explicitamente.
Exemplo de destruição de sessão:
O garbage collector é executado probabilisticamente a cada requisição (baseado em session.gc_probability e session.gc_divisor). Por padrão, a probabilidade é de 1%.
Segurança de sessão
A segurança das sessões é crucial para evitar ataques como sequestro de sessão (session hijacking) e fixação de sessão (session fixation). Abaixo, algumas práticas essenciais:
- Use cookies seguros e HttpOnly: Configure o PHP para usar cookies com as flags
secure(somente HTTPS) ehttponly(inacessível via JavaScript). Isso reduz o risco de roubo de cookie via XSS. - Regeneração do ID da sessão: Após o login, chame
session_regenerate_id(true)para evitar fixação de sessão. - Valide o IP e User-Agent: Armazene o IP e o User-Agent do usuário na sessão e verifique a cada requisição. Se houver discrepância, destrua a sessão.
- Defina um tempo de expiração: Use
session.gc_maxlifetimee também defina um tempo de inatividade (ex.: 30 minutos) para destruir sessões ociosas. - Armazene sessões em local seguro: Por padrão, as sessões são armazenadas em arquivos temporários. Em produção, considere usar banco de dados ou Redis para maior segurança e escalabilidade.
Exemplo de regeneração de ID após login:
Além disso, sempre use HTTPS para proteger a transmissão do cookie de sessão. Evite passar o ID da sessão via URL, pois isso pode vazar em logs e referers.
Boas práticas e observações finais
Lembre-se de que as sessões consomem recursos do servidor. Para aplicações de alto tráfego, considere alternativas como tokens JWT para autenticação stateless. No entanto, para a maioria dos casos, as sessões PHP são adequadas e fáceis de usar. Sempre teste a funcionalidade em diferentes navegadores e configurações.
Referências
- PHP: Manual de Sessões
- PHP: session_start - Manual
- PHP: $_SESSION - Manual
- PHP: Segurança de Sessões
- OWASP: Session Fixation
- OWASP: Session Hijacking
- PHP: session_regenerate_id - Manual
Exercícios
Crie um script PHP que inicia uma sessão, armazena o nome do usuário (fornecido via GET) e exibe uma mensagem de boas-vindas. Se o nome não for fornecido, exiba uma mensagem padrão.
✓ Resposta:Implemente um contador de visitas usando sessão. A cada carregamento da página, incremente o contador e exiba o número de visitas.
✓ Resposta:Crie um sistema de login simples que armazena o nome de usuário na sessão após o login. Inclua um botão de logout que destrói a sessão.
✓ Resposta:Logout"; } else { echo ""; } ?>Explique por que é importante regenerar o ID da sessão após o login e forneça um exemplo de código que faça isso.
✓ Resposta:A regeneração do ID da sessão após o login previne ataques de fixação de sessão, onde um atacante força um ID de sessão conhecido. Ao regenerar o ID, o ID antigo se torna inválido.
Escreva um script que verifica se o IP do cliente mudou durante a sessão. Se mudar, destrua a sessão por segurança.
✓ Resposta: