Introdução
O sequestro de sessão (Session Hijacking) ocorre quando um invasor rouba ou reutiliza um ID de sessão para se passar por um usuário autenticado. Sem medidas de segurança adequadas, um atacante pode acessar contas de usuários sem precisar da senha.
1. Utilizando sessões seguras com session_start()
Ao iniciar sessões, devemos definir configurações seguras para evitar ataques:
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1);
session_start();
Explicação:
session.use_only_cookies = 1
: Garante que a sessão só seja armazenada em cookies, evitando IDs de sessão na URL.session.cookie_httponly = 1
: Impede que scripts JavaScript acessem os cookies de sessão.session.cookie_secure = 1
: Assegura que a sessão só seja transmitida via HTTPS.
2. Regenerando o ID da sessão após login
Sempre que um usuário fizer login, devemos regenerar o ID da sessão para evitar reutilização de sessões antigas:
session_regenerate_id(true);
Isso cria um novo ID de sessão e invalida o anterior, dificultando ataques de sequestro de sessão.
3. Associando sessões ao IP e User-Agent
Para impedir que uma sessão seja usada em um dispositivo diferente, podemos associá-la ao IP e ao User-Agent do usuário:
if (!isset($_SESSION['user_ip'])) {
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
} elseif ($_SESSION['user_ip'] !== $_SERVER['REMOTE_ADDR'] || $_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) {
session_destroy();
die('Sessão inválida!');
}
Isso impede que um invasor utilize uma sessão roubada de outro IP ou dispositivo.
4. Definindo um tempo de expiração para a sessão
Para reduzir o tempo que uma sessão pode ser explorada, podemos definir um tempo máximo de inatividade:
if (isset($_SESSION['ultimo_acesso']) && (time() - $_SESSION['ultimo_acesso'] > 1800)) {
session_destroy();
die('Sessão expirada!');
}
$_SESSION['ultimo_acesso'] = time();
Isso finaliza a sessão após 30 minutos de inatividade.
5. Configurando session.save_path
para evitar ataques de acesso a arquivos de sessão
Por padrão, o PHP armazena sessões no diretório /tmp/
, acessível por outros usuários do sistema. Podemos definir um caminho seguro para as sessões:
session.save_path = "/var/www/sessoes"
E aplicar permissões restritas:
chmod 700 /var/www/sessoes
Isso impede que outros usuários do servidor acessem arquivos de sessão.
Conclusão
Proteger variáveis de sessão no PHP é essencial para evitar o sequestro de sessão. Medidas como regeneração do ID, restrições de IP, tempo de expiração e configurações seguras de cookies fortalecem a segurança da autenticação de usuários.
Por que proteger sessões PHP contra sequestro de sessão é essencial?
Sessões são fundamentais para a autenticação de usuários em aplicações PHP, mas sem proteção adequada, podem ser exploradas por atacantes. O sequestro de sessão (Session Hijacking) permite que um invasor tome controle da conta de um usuário sem precisar da senha.
Uma das principais formas de prevenir esse ataque é garantir que as sessões sejam transmitidas apenas via HTTPS e que não sejam acessíveis por JavaScript. Além disso, associar sessões ao IP e ao User-Agent do usuário dificulta a reutilização de IDs de sessão roubados.
Outra abordagem importante é regenerar o ID da sessão sempre que um usuário fizer login e definir um tempo de expiração para evitar que sessões inativas fiquem disponíveis para exploração. Essas práticas aumentam significativamente a segurança da aplicação e protegem os usuários contra acessos não autorizados.
Algumas aplicações:
- Evitar que atacantes utilizem sessões roubadas para acessar contas de usuários.
- Reduzir o risco de sequestro de sessão em conexões públicas ou não seguras.
- Melhorar a segurança da autenticação garantindo que a sessão expire corretamente.
- Impedir que sessões sejam acessadas ou modificadas por JavaScript malicioso.
Dicas para quem está começando
- Use
session_regenerate_id(true)
após o login para evitar reutilização de sessões. - Ative
session.cookie_httponly = 1
para impedir acesso de JavaScript aos cookies de sessão. - Armazene sessões em um diretório seguro com permissões restritas.
- Associe sessões ao IP e ao *User-Agent* do usuário para evitar reutilização indevida.
- Defina um tempo de expiração para sessões inativas e reduza riscos de acessos não autorizados.
Contribuições de Renata Oliveira