Deletar cookies no Cliente - CGI - CGI::Session [RESOLVIDO]

1. Deletar cookies no Cliente - CGI - CGI::Session [RESOLVIDO]

José Cleydson Ferreira da Silva
cleysinhonv

(usa Ubuntu)

Enviado em 10/04/2012 - 18:08h

Olá pessoal,

Como faço para deletar cookies no cliente usando a linguagem Perl? Estou usando o módulo CGI e CGI::Session. Preciso dessa operação para fazer logout de sistema.


  


2. MELHOR RESPOSTA

Daniel Vinciguerra
dvinciguerra

(usa Debian)

Enviado em 13/04/2012 - 14:46h

Cara,

Após invalidar sua sessão com o método $session->expire() é preciso que você envie novamente o cookie via header (ex.: print $session->header)... isso fará com que o cookie existente seja substituído por um cookie com validade expirada e fazendo assim com que este não possa ser mais usado.

Abraço,

3. Re: Deletar cookies no Cliente - CGI - CGI::Session [RESOLVIDO]

Daniel Vinciguerra
dvinciguerra

(usa Debian)

Enviado em 10/04/2012 - 20:43h

Bem... não é bem assim que a banda toca!

A sessão neste sentido é um conjunto de 2 arquivos onde o primeiro fica na maquina onde a aplicação se encontra e o segunda é o cookie propriamente dito e fica na maquina do cliente.

No arquivo que fica armazenado na maquina da aplicação(servidor), será persistida todas as informações que você solicitar, enquanto que o cookie somente grava uma referencia para a sessão que é o session id.

Vamos imaginar que sua implementação faça o seguinte:

use CGI::Session;

# novo objeto session
my $session = CGI::Session->new;

# cria e envia o cookie para o usuário
$cookie = $query->cookie( -name => $session->name, -value => $session->id );
print $query->header( -cookie => $cookie );


Então você criou o arquivo de sessão local e esta mandando uma "referencia" para que você possa saber em qual arquivo de sessão estão os dados daquele usuário.

Logo, se criamos os arquivos podemos exclui-los:

my $session = CGI::Session->load();
$session->delete();
$session->flush();

E isso ja garante que sua sessão seja invalidada, pois o usuário terá uma referencia na maquina dele para uma sessão que não mais existe.

Por outro lado e respondendo a sua questão, não á como excluir um cookie na maquina do usuário mas você pode força-lo a ser expirado para que o cookie não tenha mais validade!

Espero ter ajudado,

REFERENCIAS:
- CGI::Session
http://search.cpan.org/~markstos/CGI-Session-4.48/lib/CGI/Session.pm

- CGI::Session::Tutorial
http://search.cpan.org/~markstos/CGI-Session-4.48/lib/CGI/Session/Tutorial.pm


4. Re: Deletar cookies no Cliente - CGI - CGI::Session [RESOLVIDO]

José Cleydson Ferreira da Silva
cleysinhonv

(usa Ubuntu)

Enviado em 11/04/2012 - 09:25h

Olá Daniel,

Sua ajuda foi extremamente esclarecedora e antes de qualquer comentário agradeço a sua disposição em ajudar a solucionar o meu problema.

O controle da sessão bem como, recuperar dados, e checar se esta vazia ou não esta funcionando perfeitamente. apenas o logout que não consigo entender por que ele não fecha a sessão. Criei uma classe para me ajudar a fazer isso. Se você ainda poder me ajudar a solucionar esse problema agradeço novamente.Os códigos no qual estou fazendo isso.

View - Logout.pl

#!/usr/bin/perl -w

# Using local modules
use lib '/var/www/gsm/model/';
use lib '/var/www/gsm/controller/';

use CGI qw(:standard);
use Layout;
use Mensage;
use CGI::Session;
use SessionController;

# Instancing the modules Objects
my $page = new CGI;
my $layout = new Layout;

# Iniciang Tradution the page
print $page->header(-charset=>'utf-8');
print $page->start_html("Genome System Mining");

# Using methods the Objects
print $layout->header();

my $session = CGI::Session->load() or die CGI::Session->errstr();
if($session->is_expired)
{
$session->header(-location=>'gsm.pl');
}
elsif($session->is_empty)
{
$session->header(-location=>'gsm.pl');
}
else
{
# check login
$out = SessionController::closeSession();

if($out eq 'Ok')
{
$page->redirect(-url=>'gsm.pl');
}
else
{
$session->header(-location=>'index.pl');
}
}

# Header of cadaster
print '<center><H2><br>';
print 'Mensage';
print '</center></H2>';


# Show rodapé
print $layout->lower();

# Finalize page
print $page->end_html;

=======================================================================================
Controller -> package ::SessionController;

package ::SessionController;

# Using local modules
use lib '/var/www/gsm/model/';
use Sessao;
use Connect;

my $dbh = Connect::db;

# Method for valid user
sub loginValid
{
my $emailform = shift;
my $passwordform = shift;
if(@_)
{
my $emailform = $_[0];
my $passwordform = $_[1];
}

# Data compare the form
my $sql = "SELECT iduser,name,email,password,level,status
FROM user WHERE email='$emailform'
AND password='$passwordform'";

my $query = $dbh->prepare($sql);

$query->execute();
@result = $query->fetchrow_array();

if($passwordform eq "$result[3]" && $result[5] != 0)
{
$out = Sessao::StarSession($result[0],$result[1],$result[2],$result[4]);
return $out;
}
else
{
return 'False';
}
}

sub checkSession
{
@out = Sessao::valid();
return @out;
}

#Fechar a sessão
sub closeSession
{
$out = Sessao::DelSession;
return $out;
}
$rc = $dbh->disconnect;
return 1;

=============================================================================================
Model -> package ::Sessao;

package ::Sessao;

# Módulo responsável por fazer controle de sessão
use CGI;
use CGI::Session;

# Método pata iniciar uma sessão
sub StarSession
{
my $id =shift;
my $name =shift;
my $email=shift;
my $level=shift;

if(@_)
{
$id{id} =$_[0];
$name{name} =$_[1];
$email{email}=$_[2];
$level{level}=$_[3];
}
my $cgi = new CGI;
my $session = new CGI::Session(undef, undef, {Directory=>"/tmp"});
$cookie = $cgi->cookie(CGISESSID => $session->id);
print $cgi->header(-cookie=>$cookie);

$session->param(-name=>'iduser',-value=>"$id");
$session->param(-name=>'name' ,-value=>"$name");
$session->param(-name=>'email' ,-value=>"$email");
$session->param(-name=>'level' ,-value=>"$level");

$session->expire('+30m');
$session->flush();

return 'Ok';
}

# Abre uma sessão existente e coleta dados da sessão
sub valid
{

my $session = new CGI::Session(undef, undef, {Directory=>'/tmp'});

if($session->param('iduser') ne '' && $session->param('name'))
{
@dados=();
push(@dados,$session->param('iduser'));
push(@dados,$session->param('name'));
push(@dados,$session->param('email'));
push(@dados,$session->param('level'));
push(@dados,'Ok');
return @dados;
}
else
{
@dados=();
push (@dados,'False');
return @dados;
}
}

# Abre uma sessão existente e fecha
sub DelSession
{
my $session = CGI::Session->load();
$session->delete();
$session->flush();
return 'Ok';
}
return 1






5. Re: Deletar cookies no Cliente - CGI - CGI::Session [RESOLVIDO]

Daniel Vinciguerra
dvinciguerra

(usa Debian)

Enviado em 11/04/2012 - 10:18h

Estava estudando as entranhas da classe CGI:Session para verificar o uso do método load() e pude perceber
a necessidade no uso de parametros para que ele possa carregar a sessão.

Faça uma tentativa de passar o session_id no método load()... deve ficar parecido com o trecho abaixo:


# Abre uma sessão existente e fecha
sub DelSession
{
my $cgi = CGI->new;
my $sessid = $cgi->cookie('CGISESSID');

my $session = CGI::Session->load($sessid);
$session->delete();
$session->flush();
return 'Ok';
}

Adeque o código acima ao seu projeto...
Isso faz com que o metodo load() carrege a sessão referenciada no cookie e logo após faz a exclusão da mesma.

Abraço,



6. Re: Deletar cookies no Cliente - CGI - CGI::Session [RESOLVIDO]

José Cleydson Ferreira da Silva
cleysinhonv

(usa Ubuntu)

Enviado em 11/04/2012 - 11:48h

Oi Daniel,

Isso esta se tornando uma coisa curiosa. O fiz como sugeriu, mas o problema ainda persiste. Ele faz o logout porem se eu carregar uma url que não deveria ter acesso ele loga normalmente. Deixei um tempo para ver se a sessão esta fechando no período em que eu determinei e dessa forma esta normal. Também estou monitorando os arquivos de sessão que são criados, entendo que ao deletar-mos uma sessão esses arquivos também deveriam ser apagados ou os cookies do clientes.

Pode ser alguma configuração no apache? Ou usar outro método para fechar a sessão?


7. Re: Deletar cookies no Cliente - CGI - CGI::Session [RESOLVIDO]

Daniel Vinciguerra
dvinciguerra

(usa Debian)

Enviado em 12/04/2012 - 14:25h

Cara,

Ja tive este problema a anos atraz e sinceramente não me lembro como resolvi mas acredito que forçar a expiração do cookie seja uma opção.

Existe a opção de usar o método expire() da classe CGI::Session onde passando um valor negativo você invalida a sessão.

$session->expire('-1h');

Envie o cookie novamente para "atualizar" as informações do cookie que se encontra na maquina do
cliente e acredito que ja será o sufuciente.

Espero que funcione ai!

Abraço,


8. Re: Deletar cookies no Cliente - CGI - CGI::Session [RESOLVIDO]

José Cleydson Ferreira da Silva
cleysinhonv

(usa Ubuntu)

Enviado em 12/04/2012 - 16:54h

Sinceramente não sei o que fazer para resolver. Já vi um monte de coisa. Essa também não foi solucionável. Mas não vou desistir deve ter uma forma!


9. Re: Deletar cookies no Cliente - CGI - CGI::Session [RESOLVIDO]

José Cleydson Ferreira da Silva
cleysinhonv

(usa Ubuntu)

Enviado em 13/04/2012 - 17:44h

Show!

Solução:
my $cgi = new CGI;
my $session = new CGI::Session("driver:File", undef,{Directory=>"/tmp"});
my $cookie = $cgi->cookie(CGISESSID => '0');
print $cgi->header(-cookie=>$cookie);
$session->expire('-1m');
$session->flush();

Obrigado!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts