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
|
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.
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
|
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.
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.