As aplicações web normalmente utilizam sessões que
proporcionam um ambiente amigável para seus usuários e uma forma melhor de
gerenciamento por parte da aplicação. A ideia básica por trás do gerenciamento
de sessão é que o servidor gera um identificador de sessão (ID) e em algum
momento no início da interação do usuário, ele envia esse ID para o navegador
do usuário e que deverá retornar este mesmo ID de volta para o servidor junto
com cada nova solicitação. Com isso, os sessions IDs tornam-se um token de
identificação para os usuários que irá manter os dados da sessão.
Muitas vezes esses IDs de sessão não são apenas os códigos
de identificação, mas também autenticadores. Isto significa que após o login,
os usuários são autenticados com base em suas credenciais (ex.: usuário/senha)
e estes IDs de sessão irão ser utilizados como se fossem senhas estáticas
temporárias para acessar suas informações.
Como você pode perceber, isso faz com que os sessions IDs tornem-se
um alvo muito visado pelos atacantes que podem realizar dois tipos de ataques o
session hijacking e o session fixation. Hoje no OWASP (Open
Web Application Security Project), a vulnerabilidade de session management é listada como o segundo item mais perigoso em
uma aplicação web e isso acontece porque as proteções básicas de segurança não
são aplicadas e existem diversas ferramentas e técnicas que são capazes de
realizar esses ataques de forma muito simplificada, sendo uma das técnicas e
formas mais conhecidas envolve a exploração das vulnerabilidades de XSS (Cross
Site Scripting).
Felizmente existem diversas formas de prevenir e mitigar o
problema, com isso você irá reduzir o risco da sua aplicação. Confira abaixo como
você pode proteger as sessões de sua aplicação web.
Uso do TLS (Transport Layer Security)
Para proteger essa troca de ID das sessões contra qualquer
tipo de ataque que procure interceptar as informações, como o
man-in-the-middle, é obrigatório o uso do HTTPS (TLS) para todas as sessões web
e não só para o processo de autenticação ou onde as credenciais do usuário são envidas.
Cookies
Os cookies oferecem alguns recursos de segurança que podem
ajudar a proteger a troca de informações dos IDs das sessões entre cliente e
servidor, confira:
- Secure: Este atributo instrui o navegador a enviar os cookies somente através do HTTPS;
- HttpOnly: Este atributo instrui o navegador a não permitir que o cookie seja acessado via DOM (Ex.: JavaScript ou VBscript);
- Domain e Path: Este atributo instrui o navegador a enviar o cookie para apenas os domínios e subdomínios especificados;
Além dessas opções é altamente recomendado o uso de cookies
não persistentes para fazer o gerenciamento de sessões, pois dessa forma o
conteúdo não ficará armazenado no computador do usuário.
Ciclo de vida da
sessão
Hoje temos dois tipos de gerenciamento de sessões que são
utilizados o strict e o permissive, não vou entrar em detalhes de cada um
deles, mas o método mais comum e consequentemente mais seguro é o scrict.
Caso os dados da sessão em sua aplicação web sejam enviados
através de um GET ou POST, você deve fazer o tratamento e a verificação como
qualquer outra variável. Além disso, toda e qualquer mudança de privilégios na
aplicação deve ser tratada como nova e a aplicação deve gerar uma nova sessão.
Expiração da sessão
Uma das formas de minimizar os ataques de roubo de sessão é
determinar um tempo de expiração da sessão. Essa configuração é praticamente
obrigatória para todas as aplicações, pois quanto menor o tempo da sessão
inativa, menor será o tempo de ataque.
Outra forma que pode ajudar, mas não é uma solução
definitiva é verificar o User Agent do usuário e fixar junto com a atual sessão
ou até mesmo verificar sessões simultâneas em uma mesma conta.
EmoticonEmoticon