Una sesión es una forma de almacenar información (en variables) para ser utilizada en múltiples solicitudes HTTP, para simular un “estado” en la navegación de páginas.

A diferencia de una cookie, la información no se almacena en la computadora del usuario final sino en el servidor de la aplicación.

Por razones de seguridad, las sesiones tienen un límite de tiempo para existir antes de que caduquen. PHP tiene un límite de sesión de tiempo (session timeout) de espera predeterminado y, a veces, no es el tiempo de espera que necesita su aplicación. En esta publicación, aprenderemos cómo cambiar el tiempo de espera de la sesión de PHP.

¿Cuánto dura el tiempo de espera de una sesión de PHP?

El tiempo de espera de la sesión de PHP depende de la configuración del servidor o de las directivas relevantes session.gc_maxlifetime en el archivo php.ini.

Por lo general, el tiempo de espera predeterminado de la sesión de PHP es de 24 minutos (1440 segundos), pero es posible que su proveedor de alojamiento web haya modificado el valor predeterminado a otra cosa.

¿Qué es un tiempo de espera de sesión (timeout) razonable?

OWASP, una de las organizaciones de estándares de seguridad de aplicaciones web más autorizadas, dice sobre los tiempos de espera de sesión:

“La expiración de sesión insuficiente por parte de la aplicación web aumenta la exposición de otros ataques basados en sesión, ya que para que el atacante pueda reutilizar una ID de sesión válida y secuestrar la sesión asociada, aún debe estar activa. Cuanto más corto sea el intervalo de sesión, menor será el tiempo que un atacante tiene para usar la ID de sesión válida. Los valores de tiempo de espera de caducidad de la sesión se deben establecer de acuerdo con el propósito y la naturaleza de la aplicación web, y equilibrar la seguridad y la facilidad de uso, de modo que el usuario pueda completar cómodamente las operaciones dentro de la aplicación web sin que su sesión caduque con frecuencia… Inactividad común los intervalos de tiempo de espera son de 2 a 5 minutos para aplicaciones de alto valor y de 15 a 30 minutos para aplicaciones de bajo riesgo.”

Desde la perspectiva de las pautas federales, el borrador NIST 800-63B - Directrices de identidad digital propone la siguiente recomendación para proporcionar una alta confianza para la autenticación: “La reautenticación del suscriptor DEBE repetirse después de no más de 30 minutos de inactividad del usuario”.

Por lo tanto, sus sesiones no deberían durar más de 30 minutos. Leer el Session timeout considerations in this article.

Configuración del tiempo de espera de la sesión de PHP (session timeout)

El límite de tiempo de espera de la sesión en PHP se configura usando dos directivas en el archivo php.ini:

  • session.gc_maxlifetime: Se utiliza para establecer el límite de tiempo en segundos para almacenar la información de la sesión en el servidor durante mucho tiempo.

  • session.cookie_lifetime: Se utiliza para establecer el límite de tiempo de caducidad de la cookie PHPSESSID.

Otra forma de establecer el tiempo de espera de la sesión PHP es mediante el uso de la función ini_set() en un script PHP.

Uso de la configuración php.ini para el tiempo de espera de la sesión

Encuentre la directiva session.gc_maxlifetime y elija la más pequeña posible. session.gc_maxlifetime es una configuración para eliminar ID de sesión obsoletos. No se recomienda confiar en esta configuración. Los desarrolladores deben administrar la vida útil de las sesiones con una marca de tiempo por sí mismos.

Especifica la cantidad de segundos después de los cuales los datos se verán como “basura” y potencialmente se limpiarán. La recolección de basura puede ocurrir durante el inicio de la sesión (dependiendo de session.gc_probability y session.gc_divisor). El valor predeterminado es 1440 (24 minutos).

Busque la directiva session.cookie_lifetime y establézcala en 0 (cero). Este valor tiene un significado particular. Informa a los navegadores que no almacenen la cookie en un almacenamiento permanente. Por lo tanto, cuando se cierra el navegador, la cookie de ID de sesión se elimina inmediatamente. Si los desarrolladores configuran esto en un valor diferente a 0, puede permitir que otros usuarios usen la ID de sesión. La mayoría de las aplicaciones deberían usar “0” para esto.

Si se requiere una función de inicio de sesión automático, los desarrolladores deben implementar su propia función segura de inicio de sesión automático. No utilice ID de sesión de larga duración para esto.

Uso de directivas ini_set para establecer el tiempo de espera de la sesión

Puede configurar session.gc_maxlifetime y session.cookie_lifetime utilizando la función ini_set(<directive>, <value>).

Para esto, al comienzo de su script, llame a la función pasando la directiva y el valor deseado para configurarlo.

Vea el siguiente ejemplo:

<?php

//Set the session timeout for 2 seconds
$timeout = 2;

//Set the maxlifetime of the session
ini_set( "session.gc_maxlifetime", $timeout );

//Set the cookie lifetime of the session
ini_set( "session.cookie_lifetime", $timeout );

//Start a new session
session_start();

//Set the default session name
$s_name = session_name();

//Check the session exists or not
if(isset( $_COOKIE[ $s_name ] )) {
    setcookie( $s_name, $_COOKIE[ $s_name ], time() + $timeout, '/' );

    echo "Session is created for $s_name.<br/>";
} else {
    echo "Session is expired.<br/>";
}
?>

El siguiente resultado aparecerá después de ejecutar el script anterior por primera vez:

Session is created for PHPSESSID.

Y ejecutándolo nuevamente después de 2 segundos, la salida será:

Session is expired.

Conclusión

El tiempo de espera de sesión correcto para las aplicaciones PHP se puede configurar mediante el archivo php.ini global o mediante scripts, lo que les da a los desarrolladores más control sobre la duración de las sesiones.

Referencias