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) e httponly (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_maxlifetime e 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

Exercícios

  1. 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:
  2. 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:
  3. 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 "
    "; } ?>
  4. 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.

  5. 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: