Dev (Back & Front)ARTIGO

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.

é formado em Desenvolvimento de Sistemas para Internet pela Faculdade Véris IBTA, Zend PHP 5 Certified Engineer, blogueiro e colunista iMasters, WebInsider e IBM DeveloperWorks.

Ver perfil