- Wagner Elias – Think Security First - http://wagnerelias.com -
Hardening de sessão no PHP
Posted By Elias Wagner On 1 01America/Denver November, 2008 @ 10:36 am In Security Developer | 6 Comments
Php [1] é criticado, muitas vezes pwned [2], 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. [3]
Mas como qualquer função ela merece alguns cuidados, um simples session_start [4] e um session_unset [5] 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 [3].
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:
session_destroy() [6];
session_regenerate_id() [7];
session_start() [8];
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.
Article printed from Wagner Elias – Think Security First: http://wagnerelias.com
URL to article: http://wagnerelias.com/2008/11/01/hardening-de-sessao-no-php/
URLs in this post:
[1] Php: http://www.php.net
[2] pwned: http://www.urbandictionary.com/define.php?term=pwned
[3] Funções para sessão.: http://br2.php.net/manual/pt_BR/ref.session.php
[4] session_start: http://br2.php.net/manual/pt_BR/function.session-start.php
[5] session_unset: http://br2.php.net/manual/pt_BR/function.session-unset.php
[6] session_destroy(): http://br2.php.net/session_destroy
[7] session_regenerate_id(): http://br2.php.net/session_regenerate_id
[8] session_start(): http://br2.php.net/function.session-start
[9] : #
[10] : http://wagnerelias.com/2009/07/10/hardening-de-sessoes-em-ambiente-java/
[11] : http://www.webdeveloper.com/forum/archive/index.php/t-87633.html
Click here to print.
Copyright © 2007 Wagner Elias - Think Security First | BCP, BIA, DRP, Security Assessment, Risk Assessment, Security Developer. All rights reserved.
6 Comments To "Hardening de sessão no PHP"
#1 Comment By Anderson Cavalcante On 24 24America/Denver November, 2008 @ 8:50 am
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.
#2 Comment By Elias Wagner On 27 27America/Denver November, 2008 @ 10:10 am
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.
#3 Comment By Maicon On 22 22America/Denver May, 2009 @ 4:19 pm
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?
#4 Comment By André On 24 24America/Denver June, 2009 @ 10:19 am
Olá Wagner,
Você teria dicas semelhantes, com exemplos de implementação, para quem utiliza os “famigerados” frameworks java?
Obrigado,
André
#5 Comment By Elias Wagner On 10 10America/Denver July, 2009 @ 3:54 pm
André,
eu acabei de escrever um post sobre hardening de sessões em Java. [10]
Abs.
#6 Comment By Elias Wagner On 10 10America/Denver July, 2009 @ 3:58 pm
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: [11]
Abs.