Diferentes formas de cerrar sesión en PHP
Cómo cerrar una sesión autenticada correctamente, por inactividad o por cierre del navegador por parte del usuario.
18/5/05 - Veremos como cerrar la sesión del usuario cuando:
- El tiempo de inactividad del usuario supere "x" cantidad de tiempo (segundos, minutos, etc...).
- El usuario cierre el navegador y abandone por completo nuestro sitio.
Cierre de sesión por inactividad en PHP: módulo de control de datos
Algo que puede parecer muy obvio para unos y muy complejo para otros, pero que innegablemente muchos de nosotros nos hemos preguntado en algún momento: ¿Cómo caducar una sesión en PHP?
Ahora veremos que tan sencillo es. Solo tendremos que:
- Crear una nueva sesión que guarde una fecha y hora
- Comprobar en nuestra capa de seguridad el tiempo transcurrido entre la sesión guardada y la hora actual
- Actualizar la sesión o destruirla según corresponda
Lo primero que debemos hacer entonces, es crear la nueva sesión y asignarle como valor, la hora actual. Esto lo haremos en el momento que el usuario ingresa al sistema con sus datos de acceso.
<?
//vemos si el usuario y contraseña es váildo
if ($_POST["usuario"]=="miguel" && $_POST["contrasena"]=="qwerty"){
//usuario y contraseña válidos
session_name("loginUsuario");
//asigno un nombre a la sesión para poder guardar diferentes datos
session_start();
// inicio la sesión
$_SESSION["autentificado"]= "SI";
//defino la sesión que demuestra que el usuario está autorizado
$_SESSION["ultimoAcceso"]= date("Y-n-j H:i:s");
//defino la fecha y hora de inicio de sesión en formato aaaa-mm-dd hh:mm:ss
header ("Location: aplicacion.php");
}else {
//si no existe le mando otra vez a la portada
header("Location: index.php?errorusuario=si");
}
?>
Cierre de sesión por inactividad en PHP: módulo de seguridad
El segundo paso, será comprobar el tiempo transcurrido entre la fecha guardada y la hora actual en nuestra capa de seguridad y actuar en consecuencia.
Para hacerlo, tendremos que realizar un cálculo muy sencillo:
tiempo transcurrido = (hora actual - fecha guardada)
Y luego, restará saber si el tiempo transcurrido es mayor, menor o igual que el tiempo de caducidad de la sesión (representado como "x"):
si (tiempo transcurrido >= x), actúo en consecuencia a lo hallado
Para efectuar estos cálculos utilizaremos como unidad de tiempo el segundo. En nuestro ejemplo, caducaremos la sesión, transcurridos 10 minutos de inactividad (donde: 10*60 = 600 segundos). Para efectuar estos cálculos y tomar como unidad de medida el segundo, será necesario convertir las fechas a segundos. Para ello, utilizaremos la función strtotime.
Por lo tanto, calcularemos el tiempo transcurrido (tiempo transcurrido = (hora actual - fecha guardada)) de la siguiente manera:
<?
//iniciamos la sesión
session_name("loginUsuario");
session_start();
//antes de hacer los cálculos, compruebo que el usuario está logueado
//utilizamos el mismo script que antes
if ($_SESSION["autentificado"] != "SI") {
//si no está logueado lo envío a la página de autentificación
header("Location: index.php");
} else {
//sino, calculamos el tiempo transcurrido
$fechaGuardada = $_SESSION["ultimoAcceso"];
$ahora = date("Y-n-j H:i:s");
$tiempo_transcurrido = (strtotime($ahora)-strtotime($fechaGuardada));
//comparamos el tiempo transcurrido
if($tiempo_transcurrido >= 600) {
//si pasaron 10 minutos o más
session_destroy(); // destruyo la sesión
header("Location: index.php"); //envío al usuario a la pag. de autenticación
//sino, actualizo la fecha de la sesión
}else {
$_SESSION["ultimoAcceso"] = $ahora;
}
}
?>
Seguir navegando a partir aquí:
+ 1 manual relacionado
+ 1 categoria relacionada
+ 6 comentarios (Añadir)
+ 3 comentarios no revisados
| Autoría, licencia y acciones sobre este artículo |
|
|
Manuales relacionados con este artículo
Categorias relacionadas
A través de las categorías de nuestro directorio se pueden encontrar otro tipo de recursos relacionados con este artículo:
+ Entrar en
Manuales de PHP
Comentarios de los visitantes
|
Los comentarios de los visitantes son para ampliar la información del artículo. Cualquiera puede participar.
|
| Se muestran 6 comentarios revisados |
Comentario de jhony192
02/6/05
Esta muy bueno el articulo, pero en lo personal creo que deberia extenderse a detallarse mas los tipos de sessiones como
Cookies y WWW-Authenticate ya que ambas son tambien importantes.
Comentario de graziany
02/6/05
El artículo es muy bueno, pero existen aveces problemas que si uno no es experto en el tema se puede enredar. En el caso de la varible $_SESSION que en algunos PHP no se tiene "como en el caso mio", le recomiendo usar session_register("Nombre_Variable") y si les ocurre problemas con el PHP porque no han configurado el directorio para eso de las seciones, pueden entrar en el archivo PHP.ini buscan la linea donde aparece session.save_path y le agregan la ruta donde quiera que el sistema guarde temporalmente las seciones, ejemplo session.save_path = "c:windows emp"; este es en el caso de windows XP. Espero que esto les sirva de mucho. Att: Ingeniero Graz.
Comentario de graziany
02/6/05
El artículo es muy bueno, pero existen aveces problemas que si uno no es experto en el tema se puede enredar. En el caso de la varible $_SESSION que en algunos PHP no se tiene "como en el caso mio", le recomiendo usar session_register("Nombre_Variable") y si les ocurre problemas con el PHP porque no han configurado el directorio para eso de las seciones, pueden entrar en el archivo PHP.ini buscan la linea donde aparece session.save_path y le agregan la ruta donde quiera que el sistema guarde temporalmente las seciones, ejemplo session.save_path = "c:windows emp"; este es en el caso de windows XP. Espero que esto les sirva de mucho. Att: Ingeniero Graz.
Comentario de graziany
03/6/05
//Esto es solo una ayuda para cuando necesiten trabajar la funcion header
//en este artículo.
//Para que la funcion header() trabaje sin ningun contratiempo
// y cuando ejecute la pagina PHP desde el navegador
//esta no arroje ningun tipo de error hay que modificar una
//linea en el archivo php.ini y cambiar el estado de Off a on
//como se muestra a continucaion output_buffering=on;
//Ingeniero Graziany.
Comentario de Esteban
02/9/05
Todos los artículos están muy buenos y lo mas importante es que son muy fáciles de entender y a su vez se pueden hacer practicos en la realidad. Muchas gracias por publicar estos ariculos. Me han servido se gran ayuda. Esteban.
Comentario de Tadeo
09/8/06
Saludos, muy bueno el articulo, pero en cuanto al extra de seguridad respecto al tiempo, este solo tendrá efecto al momento de hacer algún click en la pagina protegida o al realizar alguna transacción en esta, de lo contrario esta pagina siempre estara ahi en pantalla aun transcurrido el tiempo, claro que aporta seguridad pero podría estar en pantalla información delicada por lo cual sugiero además del timeout en php usar meta redirecciones en las paginas protegidas: <META http-equiv=Refresh content="600; URL=URLdeSalida.php">
| Comentarios sin revisar |
|
Entre los comentarios no revisados puede haber algunos interesantes que se hayan enviado recientemente.
|
Se han encontrado 3 comentarios sin revisar
Ir arriba