Introdução
Manter sessões PHP ativas por muito tempo pode representar um risco de segurança, especialmente se um atacante conseguir sequestrar a sessão de um usuário. Definir um tempo limite para sessões reduz a probabilidade de ataques e melhora a proteção da aplicação.
1. Configurando o tempo de expiração da sessão no php.ini
Podemos definir um tempo máximo para as sessões diretamente no php.ini
:
session.gc_maxlifetime = 1800
session.cookie_lifetime = 1800
Isso garante que as sessões expiram após 30 minutos de inatividade.
2. Definindo a expiração da sessão no código PHP
Caso não possamos modificar o php.ini
, podemos definir a expiração manualmente:
ini_set('session.gc_maxlifetime', 1800);
ini_set('session.cookie_lifetime', 1800);
session_start();
Isso aplica o tempo limite de 30 minutos diretamente no código.
3. Destruindo sessões inativas
Além de definir um tempo limite, podemos verificar a última atividade do usuário e destruir a sessão caso ele fique inativo por um tempo:
session_start();
if (isset($_SESSION['ultimo_acesso']) && (time() - $_SESSION['ultimo_acesso'] > 1800)) {
session_destroy();
header("Location: login.php");
exit();
}
$_SESSION['ultimo_acesso'] = time();
Isso força o logout de usuários inativos, reduzindo riscos de sessões sequestradas.
4. Regenerando o ID da sessão para evitar reutilização
Sempre que um usuário fizer login ou uma ação sensível, regeneramos o ID da sessão:
session_regenerate_id(true);
Isso impede que um atacante reutilize um ID de sessão roubado.
5. Configurando cookies seguros para a sessão
Para garantir que os cookies de sessão não sejam acessados por scripts maliciosos, configuramos as seguintes diretivas:
session_set_cookie_params([
'lifetime' => 1800,
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
session_start();
Isso protege a sessão contra ataques Cross-Site Scripting (XSS) e sequestro de cookies.
Conclusão
Limitar o tempo de sessão no PHP é uma prática essencial para proteger aplicações contra acessos não autorizados e sequestro de sessão. Configurar o tempo de expiração corretamente, destruir sessões inativas e regenerar o ID da sessão são medidas fundamentais para reforçar a segurança do sistema.
Por que limitar o tempo de sessão no PHP é essencial para a segurança?
Manter sessões PHP ativas por períodos longos aumenta os riscos de ataques como Session Hijacking, onde um invasor pode capturar e reutilizar um ID de sessão para se passar pelo usuário legítimo. Esse tipo de ataque pode comprometer informações sensíveis e permitir acessos não autorizados.
Uma das principais estratégias para mitigar esse risco é definir um tempo de expiração adequado para as sessões, forçando o logout de usuários inativos. Além disso, a regeneração do ID da sessão impede que um invasor reutilize uma sessão antiga, aumentando ainda mais a segurança.
Outra prática recomendada é a configuração segura dos cookies de sessão, garantindo que apenas o servidor possa acessá-los. Essas medidas combinadas reduzem significativamente a superfície de ataque e protegem os usuários contra acessos indevidos.
Algumas aplicações:
- Reduzir o risco de sequestro de sessão por meio de IDs expirados.
- Forçar o logout de usuários inativos, impedindo acessos não autorizados.
- Melhorar a segurança de aplicações que lidam com informações sensíveis.
- Impedir que sessões sejam mantidas ativas indefinidamente sem necessidade.
Dicas para quem está começando
- Defina um tempo de expiração adequado para as sessões no
php.ini
. - Implemente verificações no código para destruir sessões inativas automaticamente.
- Registre a última atividade do usuário e force o logout após um período de inatividade.
- Utilize
session_regenerate_id(true)
para evitar reutilização de IDs de sessão. - Configure cookies de sessão como
httponly
esecure
para evitar ataques baseados em cookies.
Contribuições de Renata Oliveira