Diferentes formas de cerrar sesión en PHP

Valoración del artículo:
Cómo cerrar una sesión autenticada correctamente, por inactividad o por cierre del navegador por parte del usuario.
Publicado: 18/5/05
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
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;
   }
}
?>

Comentarios
Fueron enviados 12 comentarios al artículo
5 comentarios no revisados
7 comentarios revisados:
Por: 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.
Por: 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.
Por: 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.
Por: 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.
Por: 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.
Por: 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">

seodos
Muchas Gracias
01/10/09
me ha sido de mucha utilidad, es mucho mas limpio y profesional que usar cookies.
gracias

Manuales relacionados
Categorias relacionadas
El autor
Eugenia Bahit
Desarrolladora ASP y PHP
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Alojados en el grupo