Uma sessão é uma maneira de armazenar informações (em variáveis) a serem usadas em várias requisições HTTP, para simular um “estado” na navegação das páginas.

Ao contrário de um cookie, as informações não são armazenadas no computador dos usuários finais, mas no servidor de aplicativos.

Por razões de segurança, as sessões têm um limite de tempo para existir então expiram. O PHP possui um limite de tempo de sessão padrão e, às vezes, não é o tempo limite que seu aplicativo precisa. Neste post, vamos aprender a alterar o tempo limite da sessão do PHP.

Qual o tempo limite de sessão do PHP

O tempo limite da sessão PHP depende da configuração do servidor ou das diretivas relevantes session.gc_maxlifetime no arquivo php.ini.

Normalmente, o tempo limite padrão da sessão do PHP é 24 minutos (1440 segundos), mas seu host da web pode ter alterado o padrão para outro valor.

Qual é o tempo limite razoável para sessão

OWASP, uma das organizações com maior autoridade em padrões de segurança de aplicativos da Web, afirma sobre os tempo de sessão:

“A expiração insuficiente da sessão pelo aplicativo da Web aumenta a exposição de outros ataques baseados em sessão, assim como para o invasor poder reutilizar um ID de sessão válido e seqüestrar a sessão associada, ele ainda deve estar ativo. Quanto menor o intervalo da sessão, menor o momento em que um invasor precisa usar o ID de sessão válido. Os valores de tempo limite de expiração da sessão devem ser definidos de acordo com o objetivo e a natureza do aplicativo da Web e equilibrar a segurança e a usabilidade, para que o usuário possa completar confortavelmente as operações no aplicativo da Web sem que sua sessão expire frequentemente … Intervalos de tempo limite são de 2 a 5 minutos para aplicações de alto valor e 15 a 30 minutos para aplicações de baixo risco.”

Do ponto de vista federal das diretrizes, o projeto “NIST 800-63B – Digital Identity Guidelines” propõe a seguinte recomendação para fornecer alta confiança para a autenticação: “A reautenticação do assinante deve ser repetida após mais de 30 minutos de inatividade do usuário”.

Portanto, suas sessões não devem durar mais de 30 minutos. Leia Session timeout considerations.

Configurando o tempo limite da sessão PHP

O limite de tempo limite da sessão no PHP é configurado usando duas diretivas no arquivo php.ini:

  • session.gc_maxlifetime: É usado para definir o limite de tempo em segundos para armazenar as informações da sessão no servidor por um longo tempo.

  • session.cookie_lifetime: É usado para definir o limite de tempo de expiração para o cookie phpsessid.

Outra maneira de definir o tempo limite da sessão PHP é usando a função ini_set() em um script PHP.

Usando as configurações php.ini para o tempo limite da sessão

Encontre a diretiva session.gc_maxlifetime e escolha o menor tempo possível. O session.gc_maxlifetime é uma configuração para excluir o ID da sessão obsoleta - Garbage Colletion. A confiança nessa configuração não é recomendada. Os desenvolvedores devem gerenciar a vida útil das sessões com um registro de data e hora.

Ela especifica o número de segundos após os quais os dados serão vistos como ’lixo’ e potencialmente limpos. A coleta de lixo pode ocorrer durante o início da sessão (dependendo do session.gc_probability e session.gc_divisor). Padrão para 1440 (24 minutos).

Encontre a diretiva session.cookie_lifetime e a defina como 0 (zero). Este valor tem um significado particular. Ele informa aos navegadores que não armazenem o cookie permanente. Portanto, quando o navegador é encerrado, o cookie de ID da sessão é excluído imediatamente. Se os desenvolvedores definirem algo além de 0, podem permitir que outros usuários usem o ID da sessão. A maioria dos aplicativos deve usar “0” para esta diretiva.

Se for necessário um recurso de login automático, os desenvolvedores devem implementar seu próprio recurso seguro de Auto Login. Não use IDs de sessão de vida longa para isso.

Usando as diretivas ini_set para definir o tempo limite da sessão

Você pode definir session.gc_maxlifetime e session.cookie_lifetime usando a função ini_set(<Directive>, <Value>).

Para isso, no início do seu script, chame a função e passa a diretiva e o valor desejado para defini-lo.

Veja o seguinte exemplo:

<?php

//Defina o tempo limite da sessão por 2 segundos
$timeout = 2;

// Defina o máximo de tempo da sessão
ini_set( "session.gc_maxlifetime", $timeout );

// Defina a vida útil do cookie da sessão
ini_set( "session.cookie_lifetime", $timeout );

// Inicie uma nova sessão
session_start();

// Defina o nome da sessão padrão
$s_name = session_name();

// Verifique se a sessão existe ou não
if(isset( $_COOKIE[ $s_name ] )) {
    setcookie( $s_name, $_COOKIE[ $s_name ], time() + $timeout, '/' );

    echo "Session foi criada para $s_name.<br/>";
} else {
    echo "Session expirou.<br/>";
}
?>

A saída a seguir aparecerá após a execução do script acima pela primeira vez:

Session foi criada para PHPSESSID.

E executando-o novamente após 2 segundos, a saída será:

Session expirou.

Conclusão

O tempo limite da sessão correto para aplicativos PHP pode ser configurado usando o arquivo php.ini ou scripts globais, o que dá aos desenvolvedores mais controle sobre qual o tempo as sessões devem durar.

Referências