ISOLAMENTO DE SESSÃO EM BROWSERS COM ABAS
Posted by Mathias Grimm on julho 31, 2008 in PHP
Mais um artigo sobre um assunto pouco abordado! A motivação foi a necessidade de trabalhar com uma sessão diferente em cada aba... É muito chato testar controle de acesso dos programas pois toda hora temos que fechar o browser e mudar de usuario... não tinha como estar logado com administrador e usuário comum ao mesmo tempo, de maneira a o administrador alterar as permissões do usuário e na aba ao lado
sair testando as alterações com o usuário comum. Além dessa situação também existem outras situações que você mesmo pode lembrar!
Como o script anterior, também não testei muito bem, mas o que testei funcionou! =) Comecei tentando usar o mod_rewrite do apache, até fiz umas bobeirinhas mas no final das contas não estava conseguindo passar variáveis para o .htaccess, tentei usar o apache_setvar() e dentro do .htaccess não consegui recuperar as variáveis %{ENV:variavel} que estava definindo no php... talvez alguém até possa me ajudar... mas no final da contas a implemetação toda em php ficou mais flexível e didática.
Bom, vamos começar a ir em direção do que interessa!
A ídeia foi criar um índice dentro da $_SESSION para cada aba,e consegui isso formatando TODOS os links do sistema. Criei uma classe utilitária para auxiliar de forma muito simples essa formatação. A classe nada mais faz do que concatenar um id único
( mktime() ) com o link e transitar ele de página em página. Essa concatenação só acontece quando não existe o id ainda no link. Dessa forma existe a possibilidade de você ter duas abas com a mesma sessão e uma com outra... ou quantas você quiser...
O que vai definir a que sessão a aba pertence é o id da sessao que está na URL
O Artigo contém 3 arquivos (duas classes e a index) e agora vou dar uma passada rápida por cada um deles
1. index.php
<?php include_once("LinkHelper.php"); include_once("SessionHelper.php"); ?> <form method=post action = '<?php $link = "?p=index&a=login"; $flink = LinkHelper::formatLink($link); echo $flink; ?>' > User: <input type=text name=user> Password: <input type=password name=pass> <input type=submit value='Log me in!'> </form> <?php { $sid = $_GET['sid']; $obSessionHelper = new SessionHelper($sid); $someVar = $obSessionHelper->getValue('dummy'); $someVar+=1; $obSessionHelper->setValue('dummy',$someVar); { $obSessionHelper->setValue('user',$_POST['user']); } if(!$obSessionHelper->getValue('loginTime')) { } $obSessionHelper->dump(); } ?>
A index possui um formulário de login (não exatamente!!!) e após fazer o login é possível ver algo acontecendo! Após efetuar o login faça alguns testes... clique na barra de endereço, de um ENTER e depois dê alguns reloads e veja o comportamento das variáveis de sessão. Abra uma outra aba e faça um novo login,perceba que cada login está com valores diferentes registrados em sessão.
2. SessionHelper.php
<?php //class to handle session class SessionHelper { private $sid; function __construct($sid) { $this->sid = $sid; { } } function setValue($name,$value) { $sid = $this->sid; $_SESSION[$sid][$name] = $value; } function getValue($name) { $sid = $this->sid; { return $_SESSION[$sid][$name]; } } //function for debug... function dump() { $sid = $this->sid; } } ?>
A classe SessionHelper deve ser utilizada para controlar os valores da sessão,ela é que controla qual sessão será utilizada. Basta definir o id da sessão no construtor da classe, assim como foi feito na index.php, à partir daí é só utilizar o objeto para controlar as sessões como se estivesse utilizar a variável $_SESSION. Para definir um valor utilize o método setValue e para recuperar o valor utilize getValue (não diga!).
Aaaa... quando estava implementando a classe percebi um bug no php, inclusive está comentando na classe LinkHelper que falarei agora!
3. LinkHelper
<?php //class to format links //all links need to be formated to preserve isolation class LinkHelper { //format a real link { { //need to be a string! Bug in session array for integer values //http://bugs.php.net/bug.php?id=42472 $link.="&sid=".$sid; } return $link; } } ?>
Como falei acima, tive que utilizar o id da sessão como string (por isso o "ssid_" concatenado!), pois como integer estava "dando pau"... tentei utilizar um cast até na $_SESSION ehhehe mas mesmo assim rolava uma mensagem de erro "Notice: Unknown: Skipping numeric key 0. in Unknown on" ou algo parecido com isso! Parece que foi corrigido em alguma release do php 5.2 mas não me detive nisso!
Bom, não utilizei as melhores práticas de programação pois tentei mostrar a idéia de forma simples e didática, permitindo a cada um implementar uma maneira que melhor se adapte a sua necessidade. Talvez o artigo seja mais interessante do que útil, mas espero ter ajudado.
Abraço a todos!
5 Comentários on ISOLAMENTO DE SESSÃO EM BROWSERS COM ABAS
By Pablo Santiago Sánchez on julho 31, 2008 at 8:23 am
Que legal, você facilitou ainda mais session hijack.
By Feijão on julho 31, 2008 at 9:33 am
me sinto burro outra vez…
não dá pra abordar outros temas, como globalização, drogas, capitalismo?
By Mathias Grimm on julho 31, 2008 at 11:55 am
Pablo, essa foi uma maneira didática, mas de qualquer tudo tem seu preço.
Talvez isso fosse ideal para utilizar apenas em ambiente de desenvolvimento, facilitando muitas coisas. Para ambiente de produção poderia fazer um calculo em cima do id e tal.. coisas do tipo…
By Mathias Grimm on julho 31, 2008 at 2:11 pm
Po feijão!! ehehhe acho q vou publicar algo sobre globalização no proximo artigo…
também pensei em aborto ou algo assim! ehhehe
abraço
By Marcelo Telles on outubro 30, 2009 at 7:00 am
Muito bom seu artigo sobre multiplas session no mesmo navegador, realemnte funciona! Estava procurando algo sobre isso e seu trabalho me ajudou
A unica coisa que acho que nao fica legal é ter que passar o id da session pela url, isso na gera insegurança?
Subscribe
Follow comments by subscribing to the ISOLAMENTO DE SESSÃO EM BROWSERS COM ABAS Comments RSS feed.