Evitando frustrações com sessões no PHP

Aplicações Web PHP podem acrescentar estado nas suas aplicações de forma muito fácil, porque a ilusão de estado é mantida através do ID de uma sessão e nela podemos transportar informações entre uma página e outra sem perdê-la no meio do caminho. Talvez você já tenha perdido uma produtividade potencial por conta de bugs bizarros ou até mesmo brechas de segurança por causa dessas belezinhas. Aqui vão quatro dicas para evitar que você fique perdendo tempo e garanta o seu site.

1. Não use underscores em hostnames

A menos que você tenha memorizado o RFC de caracteres permitidos no nome do host, você pode não estar ciente de que não é permitido colocar underscores em nomes de hosts. Em alguns browsers, como o firefox, não aplica esta proibição, mas o Internet Explorer vai se recusar a setar um cookie/session cujo hostname possua underscores. O IE vai fazer com que em cada página carregada seja gerado um novo ID de sessão. Mas o usuário nunca vai aceitá-la. Fonte: documentação set_cookie.

2. Atualize suas sessões depois de redirects

Você deve chamar a função  session_write_close (ou pelo alias session_commit) para escrever os dados na sessão antes que qualquer HTTP Location redirects seja emitido. Este comando também “libera” a sessão do usuário assim ele pode fazer outras atividades na sua aplicação. Veja os comentários por cenaculo e bkatz.

3. Prevenindo a fixação de sessão

Fixação de sessão ou session fixation, permite que qualquer usuário mal intencionado receba o id de uma sessão válida passando um simples link. Sem predizê-la ou roubá-la do cookie de algum usuário ou através de um $_GET comum. A vitima é pega utilizando o id da sessão gerada pelo “hacker” e não através do servidor. Você pode prevenir este tipo de ataque chamando a função  session_regenerate_id(), particularmente após armazenar informações importantes como o nome de um login ou uma flag. Isso vai mostrar para o “hacker” um id de sessão inútil. Chris Shifflet fez uma discussão mais meticulosa sobre Session Fixation.

Exemplo de ataque via Session Fixation

4- Não exponha id’s de sessão.

Cookies talvez sejam, relativamente, o lugar mais seguro para armazenar o id de suas sessões se comparando a incorporá-la diretamente na sua url (via PHPSESSID). Aqui vão duas configurações (via php.ini) para controlar este comportamento, cada um deles são muito importantes, por isso você deve setar ambos. Você deve setar o session.use_trans_sid para (off) e se você estiver utilizando PHP 4.3.0 ou superior você pode setar também session.use_only_cookies para “1?.

[]’s
Igor.

3 thoughts on “Evitando frustrações com sessões no PHP

Leave a comment