Funciones para el manejo de sesiones

CXXXVII. Funciones para el manejo de sesiones

El apoyo que PHP proporciona para las sesiones consiste en una forma de conservar ciertos datos a lo largo de los subsiguientes accesos, lo cual le permite construir aplicaciones m谩s personalizadas e incrementar el atractivo de su sitio web.

Si ya est谩 familiarizado con el tratamiento de sesiones de PHPLIB, notar谩 que algunos conceptos son similares al soporte de las sesiones de PHP.

A cada visitante que accede a su web se le asigna un identificador 煤nico, llamado "session id" (identificador de sesi贸n). 脡ste se almacena en una cookie por parte del usuario o se propaga en la URL.

El soporte de las sesiones le permite registrar un n煤mero arbitrario de variables que se conservar谩n en las siguientes peticiones. Cuando un visitante acceda a su web, PHP comprobar谩 autom谩ticamente (si session.auto_start est谩 puesto a 1) o cuando usted lo especifique (de forma expl铆cita mendiante session_start() o impl铆cita a trav茅s de session_register()) si se le ha enviado un "session id" espec铆fico con su petici贸n, en cuyo caso se recrean las variables que se hab铆an guardado anteriormente.

Todas las variables registradas son almacenadas tras finalizar la petici贸n. Las variables que est谩n indefinidas se marcan como no definidas. En los subsiguientes accesos, no estar谩n definidas por el m贸dulo de sesiones a menos que el usuario las defina m谩s tarde.

Las opciones de configuraci贸n track_vars y register_globals influyen notablemente en la forma en que las variables de la sesi贸n se almacenan y restauran.

Nota: A partir de PHP 4.0.3, track_vars siempre est谩 activado.

Nota: A partir de PHP 4.1.0, $_SESSION est谩 disponible como variable global, al igual que $_POST, $_GET, $_REQUEST y dem谩s. Al contrario que $HTTP_SESSION_VARS, $_SESSION siempre es global. Por tanto, no se debe usar global para $_SESSION.

Si track_vars est谩 activado y register_globals est谩 desactivado, s贸lo los miembros del vector asociativo global $HTTP_SESSION_VARS pueden ser registrados como variables de la sesi贸n. Las variables restauradas de la sesi贸n s贸lo estar谩n disponibles en el vector $HTTP_SESSION_VARS.

Ejemplo 1. Registrar una variable con track_vars activado

<?php
session_start
();
if (isset(
$HTTP_SESSION_VARS['count'])) {
   
$HTTP_SESSION_VARS['count']++;
}
else {
   
$HTTP_SESSION_VARS['count'] = 0;
}
?>

Se recomienda usar $_SESSION (o $HTTP_SESSION_VARS con PHP 4.0.6 o inferior) por seguridad y para hacer el c贸digo m谩s legible. Con $_SESSION o $HTTP_SESSION_VARS, no es necesario usar las funciones session_register() / session_unregister() / session_is_registered(). Los usuarios pueden acceder a una variable de la sesi贸n como si se tratase de una variable normal.

Ejemplo 2. Registrar una variable con $_SESSION.

<?php
session_start
();
// Use $HTTP_SESSION_VARS con PHP 4.0.6 o inferior
if (!isset($_SESSION['count'])) {
    
$_SESSION['count'] = 0;
} else {
    
$_SESSION['count']++;
}
?>

Ejemplo 3. Borrar una variable con $_SESSION.

<?php
session_start
();
// Use $HTTP_SESSION_VARS con PHP 4.0.6 o inferior
unset($_SESSION['count']);
?>

Si register_globals est谩 activado, todas las variables globales pueden ser registradas como variables de la sesi贸n, y las variables de la sesi贸n ser谩n restauradas a sus correspondientes variables globales. Como PHP debe saber qu茅 variables globles est谩n registradas como variables de la sesi贸n, los usuarios deben registrar las variables con la funci贸n session_register(), mientras que con $HTTP_SESSION_VARS/$_SESSION no es necesario usar session_register().

Atenci贸n

Si est谩 usando $HTTP_SESSION_VARS/$_SESSION y desactiva register_globals, no use session_register(), session_is_registered() ni session_unregister().

Si activa register_globals, session_unregister() deber铆a ser usado a partir de que las variables de la sesi贸n sean registradas como variables globales cuando los datos de la sesi贸n se guardan. Se recomienda desactivar register_globals por motivos de seguridad y rendimiendo.

Ejemplo 4. Registrar una variable con register_globals activado

<?php
if (!session_is_registered('count')) {
    
session_register("count");
    
$count = 0;
}
else {
    
$count++;
}
?>

Si track_vars y register_globals est谩n activados, las variables globales y las entradas de $HTTP_SESSION_VARS/$_SESSION har谩n referencia al mismo valor para variables ya registradas.

Si el usuario utiliza session_register() para registrar una variable, el vector $HTTP_SESSION_VARS/$_SESSION no contendr谩 esa variable hasta que se cargue de los datos de la sesi贸n. (p.ej. hasta la pr贸xima petici贸n).

Hay dos formas de propagar un "session id":

  • Cookies

  • Par谩metro en la URL

El m贸dulo de sesiones admite ambas formas. Las Cookies son la mejor opci贸n, pero como no son fiables (los clientes no est谩n obligados a aceptarlas), no podemos confiar en ellas. El segundo m茅todo incrusta el "session id" directamente en las URLs.

PHP es capaz de hacerlo de forma transparente al usuario cuando se compila con --enable-trans-sid. Si activa esta opci贸n, las URIs relativas ser谩n modificadas de forma que contengan el session id autom谩ticamente. Alternativamente, puede usar la constante SID que est谩 definida, si el cliente no env铆a la cookie adecuada. El SID puede tener la forma de nombre_de_sesion=session_id o ser una cadena vac铆a.

El ejemplo siguiente demuestra c贸mo registrar una variable, y c贸mo colocar correctamente un enlace a otra p谩gina usando la constante SID.

Ejemplo 5. Contar el n煤mero de impresiones de un usuario

<?php
if (!session_is_registered('count')) {
    
session_register('count');
    
$count = 1;
}
else {
    
$count++;
}
?>

Hola, visitante. Has visto esta p&aacute;gina <?php echo $count; ?> veces.

<?php
# el <?php echo SID?> (Se puede usar <?=SID?> si short tag est&aacute; activado)
# es necesario para conservar el session id
# en caso de que el usuario haya desactivado las cookies
?>

Para continuar, haga click <A HREF="nextpage.php?<?php echo SID?>">aqu&iacute;</A>.

El <?=SID?> no es necesario si se ha usado --enable-trans-sid al compilar PHP.

Nota: Se asume que las URLs no relativas apuntan a sitios web externos, y por tanto no se a帽ade el SID, ya que pasar el SID a un servidor diferente podr铆a ocasionar un agujero de seguridad.

Para implementar el almacenamiento en bases de datos o en otro tipo de almacenamiento, necesitar谩 usar session_set_save_handler()() para crear una colecci贸n de funciones de almacenamiento a nivel de usuario.

El sistema de control de sesiones soporta varias opciones de configuraci贸n que puede colocar en su archivo php.ini. Les daremos un peque帽o repaso.

  • session.save_handler define el nombre del controlador que se usa para almacenar y recuperar los datos asociados a la sesi贸n. Su valor por defecto es files.

  • session.save_path define el argumento que se pasa al controlador de almacenamiento. Si elige el controlador de archivos por defecto, esta es la ruta donde los archivos se crean. Por defecto es /tmp. Si la profundidad de la ruta de session.save_path es mayor que 2, no se llevar谩 a cabo la recolecci贸n de basura.

    Aviso

    Si lo deja apuntando a un directorio con permiso de lectura por el resto de usuarios, como /tmp (la opci贸n por defecto), los dem谩s usuarios del servidor pueden conseguir robar las sesiones obteni茅ndolas de la lista de archivos de ese directorio.

  • session.name especifica el nombre de la sesi贸n que se usa como nombre de la cookie. S贸lo deber铆a contener caracteres alfanum茅ricos. Por defecto vale PHPSESSID.

  • session.auto_start especifica si el m贸dulo de las sesi贸n inicia una sesi贸n autom谩ticamente al comenzar la petici贸n. Por defecto est谩 0 (desactivado).

  • session.cookie_lifetime especifica la duraci贸n de la cookie en segundos que se manda al navegador. El valor 0 significa "hasta que se cierra el navegador", y es el que se encuentra por defecto.

  • session.serialize_handler define el nombre del controlador que se utiliza para guardar y restaurar los datos. Actualmente se soportan un formato interno de PHP (cuyo nombre es php) y WDDX (cuyo nombre es wddx). WDDX s贸lo est谩 disponible si PHP est谩 compilado con Soporte para WDDX. Por defecto es php.

  • session.gc_probability especifica la probabilidad de que se inicie la rutina gc (garbage collection - recoleci贸n de basura) en cada petici贸n en porcentaje. Por defecto es 1.

  • session.gc_maxlifetime especifica el n煤mero de segundos tras los cuales los datos se considerar谩n como 'basura' y ser谩n eliminados.

  • session.referer_check contiene la subcadena que usted quiera que se compruebe en cada "HTTP Referer" (N.T.: P谩gina desde donde proviene el enlace a la p谩gina actual). Si el "Referer" fue enviado por el cliente y la subcadena no se ha encontrado, el session id incrustado ser谩 marcado como inv谩lido. Por defecto es una cadena vac铆a.

  • session.entropy_file indica la ruta a un recurso externo (un archivo) que se usar谩 como fuente adicional de entrop铆a en el proceso de creaci贸n de session id's. Por ejemplo /dev/random o /dev/urandom, que est谩n disponibles en muchos sistemas Unix.

  • session.entropy_length especifica el n煤mero de bytes que ser谩n leidos del archivo indicado m谩s arriba. Por defecto es 0 (desactivado).

  • session.use_cookies indica si el m贸dulo puede usar cookies para guardar el session id en el lado del cliente. Por defecto est谩 a 1 (activado).

  • session.cookie_path especifica la ruta a colocar en session_cookie. Por defecto es /.

  • session.cookie_domain especifica el dominio a establecer en session_cookie. Por defecto no se especifica ninguno en ning煤n caso.

  • session.cache_limiter especifica el m茅todo de control del cach茅 a usar en las p谩ginas de la sesi贸n (none/nocache/private/private_no_expire/public). Por defecto es nocache (no guardar las p谩ginas en el cach茅).

  • session.cache_expire especifica el tiempo-de-vida de las p谩ginas de la sesi贸n que se encuentran en el cach茅 en minutos. No tiene efecto para el limitador nocache. Por defecto vale 180.

  • session.use_trans_sid indica si la inclusi贸n del sid transparente est谩 activada o no, si fue activada compilando con --enable-trans-sid. Por defecto est谩 a 1 (activado).

  • url_rewriter.tags especifica qu茅 etiquetas html ser谩n reescritas para incluir el session id si la inclusi贸n del sid transparente est谩 activada. Las etiquetas por defecto son a=href,area=href,frame=src,input=src,form=fakeentry

Nota: El manejo de sesiones fue a帽adido en PHP 4.0.

Tabla de contenidos
session_cache_expire -- Devuelve la caducidad actual del cach茅
session_cache_limiter -- Lee y/o cambia el limitador del cach茅 actual
session_commit -- Alias of session_write_close()
session_decode -- Decodifica los datos de una sesi贸n a partir de una cadena
session_destroy -- Destruye todos los datos guardados en una sesi贸n
session_encode --  Codifica los datos de la sesi贸n actual en una cadena
session_get_cookie_params --  Obtiene los par谩metros de la cookie de la sesi贸n
session_id -- Lee y/o cambia el session id actual
session_is_registered --  Comprueba si una variable est谩 registrada en la sesi贸n
session_module_name -- Lee y/o cambia el m贸dulo de la sesi贸n actual
session_name -- Lee y/o cambia el nombre de la sesi贸n actual
session_regenerate_id --  Actualizar el id de sesi贸n actual con una reci茅n generada
session_register --  Registrar una o m谩s variables globales con la sesi贸n actual
session_save_path -- Lee y/o cambia la ruta donde se guardan los datos de la sesi贸n actual
session_set_cookie_params --  Cambia los par谩metros de la cookie de la sesi贸n
session_set_save_handler --  Establece unas funciones para el almacenamiento de los datos de la sesi贸n a nivel de usuario
session_start -- Inicializar los datos de una sesi贸n
session_unregister --  Desregistrar una variable de la sesi贸n actual
session_unset --  Elimina todas las variables de la sesi贸n
session_write_close -- Escribe los datos de la sesi贸n y la finaliza