Diferentes formas de fechar sessão em PHP
Como fechar uma sessão autenticada corretamente, por inatividade ou por fechamento do navegador por parte do usuário.Por Eugenia Bahit
Publicado em: 15/2/08
Veremos como fechar a sessão do usuário quando:
- O tempo de inatividade do usuário supere "x" quantidade de tempo (segundos, minutos, etc...).
- O usuário feche o navegador e abandone por completo nosso site.
Fechamento de sessão por inatividade em PHP: módulo de controle de dados
Algo que pode parecer muito óbvio para uns e muito complexo para outros, mas que inegavelmente muitos de nós já nos perguntamos em algum momento: Como expirar uma sessão em PHP?
Agora veremos que simples é. Só temos que:
- Criar uma nova sessão que salve uma data e hora
- Comprovar em nossa camada de segurança o tempo transcorrido entre a sessão salva e a hora atual
- Atualizar a sessão ou destruí-la segundo corresponda
O primeiro que devemos fazer então, é criar a nova seção e atribuir-lhe como valor, a hora atual. Faremos isto no momento que o usuário entra no sistema com seus dados de acesso.
<?
//vemos se o usuário e senha são válidos
if ($_POST["usuario"]=="miguel" && $_POST["senha"]=="qwerty"){
//usuario e senha válidos
session_name("loginUsuario");
//atribui um nome à sessão para poder salvar diferentes dados
session_start();
// inicio l sessão
$_SESSION["autenticado"]= "SI";
//defino a sessão que demonstra que o usuário está autorizado
$_SESSION["ultimoAcesso"]= date("Y-n-j H:i:s");
//defino a data e hora de inicio de sessão em formato aaaa-mm-dd hh:mm:ss
header ("Location: aplicacao.php");
}else {
//se não existe lhe mando outra vez ao portal
header("Location: index.php?errousuario=si");
}
?>
Fechamento de sessão por inatividade em PHP: módulo de segurança
O segundo passo, será comprovar o tempo transcorrido entre a data salva e a hora atual em nossa camada de segurança e atuar em conseqüência.
Para fazê-lo, teremos que realizar um cálculo muito simples:
tempo transcorrido = (hora atual - data salva)
E logo, restará saber se o tempo transcorrido é maior, menor ou igual que o tempo de expiração da sessão (representado como "x"):
se (tempo transcorrido >= x), atuo em conseqüência ao achado
Para efetuar estes cálculos utilizaremos como unidade de tempo o segundo. Em nosso exemplo, expiraremos a sessão, transcorridos 10 minutos de inatividade (onde: 10*60 = 600 segundos). Para efetuar estes cálculos e tomar como unidade de medida o segundo, será necessário converter as datas a segundos. Para isso, utilizaremos a função strtotime.
Portanto, calcularemos o tempo transcorrido (tempo transcorrido = (hora atual - data salva)) da seguinte maneira:
<?
//iniciamos a sessão
session_name("loginUsuario");
session_start();
//antes de fazer os cálculos, comprovo que o usuário está logado
//utilizamos o mesmo script que antes
if ($_SESSION["autenticado"] != "SI") {
//se não está logado o envio à página de autenticação
header("Location: index.php");
} else {
//senão, calculamos o tempo transcorrido
$dataSalva = $_SESSION["ultimoAcesso"];
$agora = date("Y-n-j H:i:s");
$tempo_transcorrido = (strtotime($agora)-strtotime($dataSalva));
//comparamos o tempo transcorrido
if($tempo_transcorrido >= 600) {
//se passaram 10 minutos ou mais
session_destroy(); // destruo a sessão
header("Location: index.php"); //envio ao usuário à página de autenticação
//senão, atualizo a data da sessão
}else {
$_SESSION["ultimoAcesso"] = $agora;
}
}
?>
Comentários do artigo
funcionou! Por: wagner | | 15/3/09
|
solucao muito criativa e eficiente! Parabens!
tentei de tudo e nao conseguia resolver este problema com os comandos session_cache_expire()