O PHP possui um sistema interno de gerenciamento de sessões muito prático, porém inseguro, tanto que existe uma referência no manual do PHP chamado Sessões e segurança com dicas para aumentar a segurança das variáveis de sessão. Para entender o porque desta insegurança, vamos compreender como o sistema funciona.
Sempre que uma sessão é inicializada, seja através da função session_start(), ou automaticamente, o PHP envia uma cookie para o cliente com um hash único, e cria um arquivo chamado “sess_” concatenado com o hash único enviado para o cliente.
Este arquivo é criado dentro do diretório especificado na variável de configuração do PHP chamada session.save_path. Se não for configurada, o valor padrão é “/tmp”. Este diretório deve estar acessível caso esteja sendo utilizado a funcionabilidade de open_basedir.
O arquivo criado contém todos os valores armazenados nas variáveis de sessão, que é a array super global do PHP $_SESSION, sendo mantida toda estrutura através da função serialize().
Sempre que a função session_start() é executada, o PHP procura no diretório de sessões se existe um arquivo “sess_” mais o conteúdo da variável. Caso o mesmo exista, ele lê o conteúdo deste arquivo e utiliza a função unserialize() para restaurar o conteúdo da super global $_SESSION.
Ocorre que normalmente esta configuração é mantida como padrão, ou seja, todos os sites hospedados em um servidor possuem um diretório temporário em comum, incluindo suas variáveis de sessões, possibilitando que um atacante possa escrever um script que acesse todos arquivos começados com “sess_” no diretório temporário, leia o seu conteúdo e exponha os dados, através do comando unserialize().
Além da possibilidade de leitura dos dados, pode-se também alterar o seu conteúdo, incluindo, excluindo ou alterando valores, pois o servidor web possui permissão de leitura e escrita.
Existem diversas alternativas para implementar mais segurança aos dados armazenados através de sessões. Uma delas é a utilização da função session_set_save_handler() para definir a seqüência de funções de armazenamento utilizadas no gerenciamento do controle de sessão. Com isto, podemos criar uma interface para armazenar os dados em MySQL, ao invés de gravá-los em disco, ou simplesmente adicionar uma função de criptografia para o armazenamento e carga dos dados no disco.



