Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Nota: Lamentablemente algunos ejemplos de este artculo se vern momentneamente rotos, pues el plugin de hilite de sintxis de wordpress no funciona muy bien, y omite el cdigo que est escrito dentro de bloques de cdigo de php. En cuanto arregle el plugin o salga un fix se vern los ejemplos al 100% nuevamente. Si alguien conoce una solucin por supuesto se agradecer el dato.
Introduccin
En este artculo vamos a explicar el manejo de sesiones en PHP, su utilidad, las funciones y las directivas de configuracin implicadas en el manejo de sesiones.
2. Propagar este identificador nico a travs de los diferentes accesos del visitante para que podamos reconocerlo (estamprselo en la frente). Nuestro identificador nico es una cadena nica aleatoria con la que marcamos al visitante. Llamaremos a este identificador nico session_id. No tendremos que preocuparnos por generar el session_id pues el sistema de sesin se encarga automticamente de generarlo. Ahora, dado que el session_id es generado del lado del servidor, hay que encontrar alguna forma de que esa informacin persista a travs de los diferentes accesos del mismo visitante. No es posible vincular el session_id con la direccin IP del usuario ya que hay varios casos en que la misma IP puede ser utilizada por varios usuarios, por ejemplo cuando varios usuarios estn tras un proxy o tras un router que est haciendo IP masquerade. Por lo tanto para que el session_id est disponible junto a cada solicitud de pgina del usuario es necesario propagar el session_id para que est presente junto al visitante en cada acceso y as podamos identificarlo. Esto se llama propagacin de la sesin y ms adelante veremos cmo se hace.
<a href="http://localhost/blog/wordpress/pagina2.php">Vis ita la siguiente pgina</a> session_start() comienza la sesin si no la hay, o contina con la sesin del visitante si esta ya exista; la siguiente sentencia se encarga de guardar en la posicin "actividad" del array asociativo de la sesin la cadena: "He visto a George la cacata!". Esta informacin estar disponible an cuando el visitante acceda otras pginas de nuestro sitio, y esta es la magia de las sesiones. Podemos hacer sobre el array $_SESSION cualquier operacin que podemos hacer sobre una un array. Esto nos d una interfaz muy intuitiva y familiar para operar con la informacin de la sesin del usuario. Operacin Ejemplo Crear un elemento $_SESSION['elemento'] = valor Eliminar un elemento unset($_SESSION['elemento']) elemento ha sido creado isset($_SESSION['elemento']) Vaciar la sesin $_SESSION = array(); Existe como alternativa al uso directo del array $_SESSION el uso de las funciones session_register(), session_unregister(), session_is_registered() y session_unset() para operar sobre la informacin de la sesin. Sin embargo, existen varios problemas en su uso que pueden hacernos introducir fallos. session_register() registra variables globales por lo que nos tendremos que cuidar en el alcance de las variables que registremos. Estas funciones solo trabajan cuando la directiva register_globals de nuestro php.ini est activada, cosa que no es nada recomendable por motivos de seguridad, y por lo mismo desde PHP 4.2.0 en adelante el valor por defecto de register_globals es off. As que no es nada recomendable utilizar estas funciones, pero si vas por ellas de todas formas o tienes un cdigo que ya las utiliza abundantemente ten en cuenta que no se deben utilizar el mtodo de acceso directo al array $_SESSION y las funciones al mismo tiempo, se debe utilizar uno o el otro. Sigamos pensando en nuestro ejemplo. Ahora, al visitar la pgina de George la cacata nuestro visitante hace click en el enlace a pagina2.php, el cdigo de esta pgina es as: Ejemplo 2 (pagina2.php) PLAIN TEXT PHP: 1. De nuevo session_start() crea o contina la sesin, como nuestro visitante ya tiene una sesin la contina, cargando sus datos en el array $_SESSION. Entonces por arte de magia la sentencia con el echo imprimir: He visto a George la cacata!
Cmo ha llegado el valor de $_SESSION['actividad'] hasta esta pgina? Ha llegado por la sesin del visitante. Los valores almacenados en la sesin son serializados en un archivo al cerrar cada script y al continuar la sesin en otra pgina son cargados en el array $_SESSION. El archivo de la sesin suele estar en el directorio /tmp en los sistemas UNIX o en c:\tmp en windows y tiene por nombre el session_id del visitante. Podemos configurar dnde queremos serializar las sesiones con la directiva session.save_path de nuestro php.ini o en tiempo de ejecucin mediante la funcin session_save_path() de esta forma: string session_save_path(string); Si llamamos a session_save_path() sin parmetros nos devuelve el save_path actual, si le pasamos una cadena la toma como el nuevo save_path. Si vas a modificar el save_path con esta funcin tienes que llamarla antes de llamar a session_start(). Ahora Cmo llega el llamado a session_start() en pagina2.php a conocer que el visitante ya tiene una sesin y continuarla? La nica forma que tiene de hacerlo es que le proporcionemos de alguna forma el session_id del visitante, esto es lo que se logra por la propagacin del session_id y vamos a explicar en datalle a continuacin.
Para hacer ms fcil la escritura del session_id en cada URL est disponible la constante SID que contiene la cadena "nombre_de_sesion=session_id", que en nuestro caso sera "PHPSESSID= F513fad624vDx3". Cmo quedara nuestro ejemplo de George la cacata si propagramos el session_id por URL? Aqu est nuestra segunda versin de la pgina: Ejemplo 3 (george_la_cacatua_reloaded.php) PLAIN TEXT PHP: 1.
1. <a href="http://localhost/blog/wordpress/pagina2.php">Vis ita la siguiente pgina</a> ser transformado automticamente por PHP en el siguiente enlace: PLAIN TEXT PHP: 1. <a href="http://localhost/blog/wordpress/pagina2.php?PHPS ESSID=%20F513fad624vDx3">Visita la siguiente pgina</a> propagando por nosotros el session_id en cada URL.
Hasta ahora hemos visto como abrir o continuar una sesin con session_start(), cmo registrar valores en la sesin haciendo asignaciones sobre el array $_SESSION, y cmo propagar el session_id por cookies o por URL; ahora veremos como cerrar una sesin. Para cerrar una sesin y terminarla completamente tenemos la funcin session_destroy(). Esta funcin se encarga de hacer desaparecer la sesin de nuestro servidor, (elimina el archivo de /tmp o de nuestro session.save_path). Si se solicita una pgina y se le enva el session_id de una sesin destruda session_start() reportar un error pues la sesin no existe. session_destroy() no elimina las posibles variables globales creadas con la sesin (correspondientes a cada posicin de $_SESSION si tenamos activado register_globals) ni vaca el array $_SESSION. Por supuesto que esto ocurrir al cerrar el script, pero si queremos asegurarnos de que la sesin muera al instante que hacemos el session_destroy() tendremos que encargarnos de vaciar la sesin nosotros mismos. As es que una destruccin tpica de sesin se vera as: Ejemplo 4 (destruyendo una sesin) PLAIN TEXT PHP: 1.
En la propagaccin del session_id es donde encontramos el punto en el que ms cuidado tendremos que tener al manejar sesiones. Vamos a discutir dnde se encuentran las posibles brechas al sistema y algunas medidas defensivas que podemos tomar. En todos los casos mencionaremos las brechas conocidas, aunque la posibilidad de que alguien las explote sea tan pequea que parezca ridculo mencionarlas. La relevencia de cada una de ellas la juzgaremos segn el sistema que estemos desarrollando.
remoto reciba la informacin del referer, que en este caso es la URL completa de nuestro sitio incluyendo el query string donde est el session_id. Si el servidor remoto est almacenando en sus logs los referers tendr all el session_id de nuestro usuario el cul podr ser utilizado para impersonarlo. Podemos evitar que se enve el referer al sitio remoto? No, de ninguna manera, pues esto es algo que hace el navegador. El nico caso en el que los navegadores no envan el referer es en el caso que se proceda desde una conexin segura. Es decir que si nuestro sitio est implementado con HTTP sobre SSL ( o https), el navegador no enviar la informacin de referer al sitio externo. As es que si tenemos enlaces externos y no queremos que nuestro session_id llegue a ser revelado por el navegador tendremos que implementar nuestro sitio sobre https. Esto nos proteger adems en el caso de que un atacante muy dedicado est a la escucha de nuestro trfico de red con un sniffer, leyendo los requests de HTTP a nuestro servidor web. 2) Brechas introducidas por el usuario.Puede que hayamos hecho todo para que el session_id no pase a sitios externos, pero an as hay situaciones en las que el URL puede ser tontamente revelada por nuestro propio usuario legtimo. Desconociendo la relevancia de la informacin en el URL nuestro usuario podra pasar un enlace de nuestro sitio a otra persona, vcitima de ingeniera social, dndole sin saber la informacin necesaria para que tome su rol. Adems, el URL puede ser agregado en los Favoritos por nuestro usuario o quedar guardado en el cache del navegador o historial, donde otro usuario de la misma mquina pueda leerlos y utilizarlos o donde un usuario remoto puede substraerlos en alguna oportunidad. De modo que por parte del usaurio hay tambin gran riesgo de revelar el session_id a un atacante.
por otros usuarios del sistema estos podran leer los session_id y la informacin de cada sesin de usuario. Hemos por lo tanto de establecer restricciones a nivel del sistema de archivos para impedir que usuarios no autorizados de nuestro propio sistema tengan acceso a las sesiones de usuario.