- Wagner Elias – Think Security First - http://wagnerelias.com -

Hardening de sessão no PHP

Posted By Elias Wagner On 1 01UTC 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:

  • 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() [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.


6 Comments (Open | Close)

6 Comments To "Hardening de sessão no PHP"

#1 Comment By Anderson Cavalcante On 24 24UTC 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.

[9] [9]

#2 Comment By Elias Wagner On 27 27UTC 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.

[9] [9]

#3 Comment By Maicon On 22 22UTC 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?

[9] [9]

#4 Comment By André On 24 24UTC 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é

[9] [9]

#5 Comment By Elias Wagner On 10 10UTC July, 2009 @ 3:54 pm

André,

eu acabei de escrever um post sobre hardening de sessões em Java. [10]

Abs.

[9] [9]

#6 Comment By Elias Wagner On 10 10UTC 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.

[9] [9]

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

Copyright © 2007 Wagner Elias - Think Security First | BCP, BIA, DRP, Security Assessment, Risk Assessment, Security Developer. All rights reserved.