1 de novembro de 2008

Hardening de sessão no PHP

Php é criticado, muitas vezes pwned, mas eu gosto. Acho uma linguagem que lhe dá muitas opções, tem uma grande comunidade, possui vasta documentação (ok, eu sei que a maioria das pessoas nem sabe que isso existe) e a maioria dos projetos open source tem algo em php. O meu envolvimento com php veio fuçando em projetos open source.

Lógicamente que devido a sua popularidade e a possibilidade de fazer qualquer coisa, o php acaba protagonizando coisas horríveis. Já ouviram a expressão: "Arma na mão de macaco"? Isso também acontece com php!

Bom, já dei muita desculpa, gosto de php e pronto!

Eu, tenho lidado com sistemas que possuem muitas falhas de segurança devido a problemas de gestão de sessão, por isso decidi escrever algo sobre as sessões do php.

Até um macaco autista consegue trabalhar com sessões no php, basta olhar o manual: Funções para sessão.

Mas como qualquer função ela merece alguns cuidados, um simples session_start e um session_unset não é suficiente caso você queira garantir a integridade dos dados da aplicação.

A primeira coisa que deve ser feita é realizar algumas configurações que irão aumentar a segurança da gestão de sessão do php. Os seguintes itens devem ser alterados no php.ini:

O nome da sessão

default: session.name = PHPSESSID
hardening: session.name = Uma string que você determinar

Path onde será armazenado a sessão no servidor
default: session.save_path = Diretório de armazenamento Temporário da Máquina(tmp)
hardening: session.save_path = Defina um diretório onde as configurações de permissão foram alteradas e somente o acesso pela aplicação é permitido.

Cookies mais seguros

Apesar da possibilidade de desenvolver algo "cookieless" é mais prático e eficaz fazer algumas configurações para aumentar a segurança dos cookies.

Uma boa prática é você não permitir que seja acessada por javascript o cookie de sessão, ataques de XSS podem ser evitados. Para isso determine que o cookie será acessado apenas por HTTP.
default: session.cookie_httponly = 0
hardening: session.cookie_httponly = 1

Se você possui o recurso de HTTPS, force o envio apenas por HTTPS.
default: session.cookie_secure = 0
hardening: session.cookie_secure = 1

A gestão de sessão usa algoritmos de hash para gerar os IDs de sessão. Por default o php usa o algoritmo md5 (128 bits), mas como já deve ser conhecimento de todos, ele já não é o mais confiável. Então altere o algoritmo de hash para SHA-1 (160 bits).
default: session.hash_fuction = 0
hardening: session.hash_fuction = 1

Com estas configurações você já vai ter mais segurança nas sessões do php, existe outras functions que podem ser alteradas, consulte o manual.

Você já garantiu um pouco mais de confiança as sessões, mas também é necessário cuidado ao manipular/usar os recursos de sessão. algumas dicas são:

  • Se possível determine o tempo que o cookie de sessão expira o mais baixo possível;

  • Use a seguinte sequência sempre que iniciar uma sessão:


session_destroy();
session_regenerate_id();
session_start();

Isso irá garantir que a sessão será destruída e um novo id será gerado sempre que você iniciar uma sessão.

Não seja um macaco com uma arma na mão, use os recursos da linguagem.

6 comentários:

Anderson Cavalcante disse...

Bom dia Wagner, tudo bem?


Se eu executo essas funções:

session_destroy();
session_regenerate_id();
session_start();

Concorda comigo que irei perder meus dados de sessão como: nome do usuário?

A idéia seria executar um select novo toda as vezes, para pegar esse tipo de informação?

Obrigado.

Elias Wagner disse...

Oi Anderson,

realmente, se você der um destroy quando uma sessão estiver estabelecida já era seu controle de estado.

Por isso mencionei que estes comandos são dados no momento que você inicia uma sessão e não quando você tem uma sessão estabelecida.

Abs.

Maicon disse...

Olá Wagner tudo bem?

amigo, sabe me dizer como permanecer a mesma sessao em paginas http e https? pois se o login é feito em https só ira identificar o usuario em paginas https certo?

André disse...

Olá Wagner,

Você teria dicas semelhantes, com exemplos de implementação, para quem utiliza os "famigerados" frameworks java?

Obrigado,
André

Elias Wagner disse...

André,

eu acabei de escrever um post sobre hardening de sessões em Java. http://wagnerelias.com/2009/07/10/hardening-de-sessoes-em-ambiente-java/

Abs.

Elias Wagner disse...

Oi Maicon,

eu estranho você criar um cookie em HTTPS e depois querer acessá-lo em HTTP, mas de qualquer forma, dê uma olhada nesta thread: http://www.webdeveloper.com/forum/archive/index.php/t-87633.html

Abs.