+4

Segurança de Sessão no PHP

criado por Douglas V. Pasqua em 15/04/2010 5:36pm
Segurança de sessão em Hosts Compartilhados

Um host compartilhado não tem a mesma segurança que um host dedicado, por isso devemos tomar algumas precauções quando trabalhamos neste ambiente.

Uma das causas das vulnerabilidades em hosts compartilhados é que os dados de sessão são armazenados em um mesmo diretório para todos os sites. Por padrão o PHP armazena os dados da sessão no diretório /tmp.

Por sorte a permissão dos arquivos de sessão permitem que somente o usuário do webserver possa ler e escrever nos arquivos. Geralmente o servidor web roda com o usuário nobody ou outro usuário definido no httpd.conf, geralmente chamado de www. Usuários comuns logados no sistema não conseguirão ler estes dados.

Porém quando se trata de uma aplicação php que roda a partir do servidor web, é possível que o programador escreva um script para acessar o diretório /tmp e ler os arquivos de sessão. Isso é possível pois o php rodando no servidor web tem permissão de acesso aos arquivos criados pelo usuário do serviço http.

Por muito tempo umas das maneiras do administrador do host de resolver problemas com segurança era usar a diretiva safe_mode. Porém o safe_mode será removido no PHP6 e não é mais aconselhável o seu uso.

Para protegermos o diretório /tmp no lado do servidor, umas das opções é utilizar a diretiva open_basedir na configuração do apache (httpd.conf) ou no php.ini. Com o open_basedir você pode limitar os diretórios onde o programador poderá abrir ou incluir arquivos. (fopen() / include). Exemplo:

<Directory /var/www>
   php_admin_value open_basedir "/var/www"
</Directory>

Dessa maneira estamos permitindo que arquivos sejam abertos somente no diretório /var/www. O diretório /tmp estará protegido.
Limitar diretórios com open_basedir não é tudo. Para uma maior segurança devemos desabiltar funções do php que permitem a execução de programas internos. Para isso use a diretiva disable_functions e disable_classes. Exemplo no php.ini:

; Desabilitar funções
disable_functions = exec,passthru,shell_exec,system

;Desabilitar classes
disable_classes = DirectoryIterator,Directory

Caso você seja um programador que deseja uma segurança maior do que somente a segurança oferecida pelo serviço de host compartilhado você pode escrever um código para armazenar os dados da sessão em outra local além do diretório /tmp. Por exemplo, você pode gravar os dados em uma tabela do banco de dados. Para isso você precisará usar a função session_set_save_handler, e escrever uma função para cada ação relacionanda à sessão.
Essa função possibilita que você tenha o controle dos dados da sessão em suas mãos e não nas mãos da administração do seu host compartilhado. Exemplo:

session_set_save_handler(
  '_open', '_close', '_read', '_write', '_destroy', '_clean');

Você deverá escrever uma função para cada ação: ‘_open’, ‘_close’, ‘_read’, ‘_write’, ‘_destroy’, ‘_clean’. Para maiores informações de como essas funções devem ser implementadas acesso o link: http://www.php.net/manual/en/function.session-set-save-handler.php

Comentários:

Mostrando 1 - 6 de 6 comentários
Sergio Santos disse:
Muito bom! Gostei
16/03/2017 10:07am (~13 dias atrás)

Hernani disse:
Muito Bom!
11/11/2016 9:03am (~4 meses atrás)

Juan disse:
Muito legal o artigo!

Obrigado por compartilhar seu conhecimento.
08/04/2014 3:54pm (~3 anos atrás)

Thyago Silva disse:
Perfeito! Valeu pelas recomendações

http://www.cupom.net
18/06/2013 1:37am (~3 anos atrás)

André Luis disse:
Muito bom o artigo, sou inciante na área de web e esse artigo já me deu uma boa base.
01/06/2013 10:36pm (~3 anos atrás)

mauricio disse:
ótimo artigo.
24/02/2013 10:34pm (~4 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)