Palavra:   

Revista PHP / Segurança

Gabriel Sobrinho

Programador php/MySQL com "vasta sabedoria" nas mesmas :)

Se protegendo contra roubo de sessões

Bom, primeiro artigo na Revista PHP. Espero que gostem...

Muitos já devem ter ouvido falar sobre roubo de sessões. Vou exemplificar um roubo de SID:

Usuário: "Tava vendo esse tópico nesse fórum e gostei... Dá uma olhada
LINK
  1. http://www.meuforum.com.br/topic-2.html?PHPSESSID=a5e8a5e8f2c5d8f2a5e8f2c5d8c5d8"
www.revistaphp.com.br
Considere que o usuário que postou o link estava logado no fórum e quem acessou, acessou num pequeno intervalo de tempo. O que vai acontecer? Quem acessar vai ficar logado na conta do usuário que postou o link... É lógico que todos os fóruns hoje tem proteção contra isso, isso foi só um exemplo.

Existem outros tipos de roubo de sessão, como por exemplo via XSS que é mais complicado de exemplificar. Procure no Google ;)

A lógica é bem simples:

1. Configurar o tempo de sessão para 1 hora (Padrão do php: 3 horas);
2. Configurar os cookies de sessão para não serem acessados via JS (Ataques XSS);
1. Configurar o php para não recuperar sessões via URL (Exemplo acima);

PHP
  1. <?php
  2. // Iniciamos a sessão.
  3. ini_set('session.cache_expire', 60);
  4. ini_set('session.cookie_httponly', true);
  5. ini_set('session.use_only_cookie', true);
  6.  
  7. ?>
www.revistaphp.com.br
Caso o servidor não aceite ini_set a nossa proteção irá falhar. Então fazemos outra em conjunto com esta. Ela verifica se foi digitada uma id de sessão na URL. Se tiver, nós destruímos a sessão, geramos outra id para a seção e iniciamos ela.
PHP
  1. <?php
  2. if(strpos(strtolower($_SERVER['REQUEST_URI']), 'phpsessid') !== false)
  3. {
  4. }
  5. ?>
www.revistaphp.com.br
Ficando assim nosso script final:
PHP
  1. <?php
  2. // Iniciamos a sessão.
  3. ini_set('session.cache_expire', 60);
  4. ini_set('session.cookie_httponly', true);
  5. ini_set('session.use_only_cookie', true);
  6.  
  7.  
  8. // Se for tentado alguma SID, destruímos a sessão e geramos outra.
  9. if(strpos(strtolower($_SERVER['REQUEST_URI']), 'phpsessid') !== false)
  10. {
  11. }
  12. ?>
www.revistaphp.com.br

Bom, é isso. Basta colocar essa validação no topo das páginas do seu site que já estará bem mais seguro. Não se baseiem somente isso também... Procurem outros métodos contra invasão ok?

Abraços e até a próxima!


Opções de Interação

Comentários

Legal
Por: Thiago, 12/06/2008   09:31:34
Poxa Gabriel legal esse seu topico muito bom mesmo, eu tava somente na duvida da session_destroy() e qual seria que vinha logo após e agora ta fucionando normalemnte, vlws...
Correção
Por: Gabriel, 23/12/2007   15:51:42
Somente uma correção no artigo,

O certo é usar "@ini_set" para caso o servidor não aceita, não exibir algum erro.

E a ordem correta para as funções da sessão são:

session_destroy();
session_start();
session_renegerate_id();

Desculpem pelo erro!