Ardilla Quio Ardilla Quio

19 de Noviembre de 2010

Sesiones en PHP: qué son y cómo funcionan

En este artículo intentaré explicar, de la forma más simple posible, qué son las sesiones en PHP, cómo funcionan y cómo las implementa el servidor web. El objetivo de este artículo no es explicar cómo usar sesiones, sino comprender la mecánica del funcionamiento, para entender cómo actúan los ataques contra ellas.

Este artículo está orientado a gente con pocos conocimientos sobre el tema, así que en ocasiones simplificaré ciertos detalles sabiendo que lo que digo es sólo media verdad (como cuando te enseñaban que no existía la raíz cuadrada de un número negativo).

Antecedentes

El protocolo que utiliza la web (HTTP) es un protocolo sin estado, es decir, que no guarda ninguna información sobre conexiones anteriores: no sabe en qué página web estuviste antes ni si ya has enviado datos al sitio web. Lo único que conoce la página web son los datos que le llegan a través de la URL.

Dado que algunas páginas web querían poder reconocer a los visitantes y guardar datos de los mismos de una conexión a otra sin tener que ir arrastrando un montón de parámetros en la URL, se inventaron las ya famosas cookies. Una cookie es un fragmento de información que se guarda en el ordenador del usuario y que está asociado al navegador con el que visitó la página web. Esto quiere decir que cada navegador guarda sus propias cookies y no las comparte con otros navegadores. La forma en la que se guarda esta información depende del navegador, aunque muchos las almacenan como archivos de texto en un directorio dado.

Cuando un navegador va a abrir una página web, si tiene alguna cookie guardada asociada a ese sitio web (en realidad, a ese dominio), coge los datos de la misma y los manda al servidor web junto con la petición de la página.

El sitio web que pone una cookie, también le dice al navegador hasta cuando debe durar (como máximo) la misma: desde "hasta que se cierre el navegador" hasta cualquier cantidad de tiempo. Un dominio sólo puede acceder a las cookies que puso él mismo en el navegador, es decir, un dominio no puede acceder a las cookies de otros dominios.

Veamos un ejemplo: pongamos que tenemos un sitio web multi-idioma y que en el momento en que escojamos un idioma distinto este quiere recordarlo, para servirnos siempre sus páginas web en él. Entonces, lo que haría sería enviarle una cookie a nuetro navegador, con nombre "idioma" y datos "español". El navegador creará un archivo para esa cookie y guardará dentro los datos. Cuando el usuario haga una nueva petición de página web, el navegador mandaría algo así: "idioma=español".

¿Qué son las sesiones en PHP?

Resumiendo, las formas que tiene un sitio web para propagar datos sobre un visitante son: la URL o las cookies. El problema con ambos recursos es que son fácilmente modificables por el usuario: la URL se puede cambiar directamente en la barra de direcciones del navegador y las cookies, al ser datos en el ordenador del usuario, también pueden ser modificadas.

Así que, para guardar datos más críticos, se necesitaba un método que no fuera modificable por los usuarios (para evitar que, por ejemplo, un usuario autenticado se hiciera pasar por otro). Así nacieron las sesiones.

Una sesión en PHP es una serie de caracteres aleatorios que forman una identificación única para cada visitante (a la que llamaremos "id de sesión"). Cuando a un usuario se le asigna un id de sesión, el servidor web crea un archivo en su sistema donde irá introduciendo todos los datos que queramos guardar. Pero, ¿cómo reconoce el sitio web al usuario en sucesivas conexiones? Pues usando alguno de los dos métodos anteriores; esto es, haciendo que el usuario le mande en la URL su id de sesión o enviándole una cookie con el mismo y con una duración de "hasta que se cierre el navegador".

¿Cómo funcionan las sesiones en PHP?

Mejor lo explicamos con un ejemplo: acabamos de autenticarnos en una página con nuestro usuario (luis) y contraseña (******). El sitio web comprueba que efectivamente son correctos y quiere poder reconocernos en las siguientes conexiones. Los datos que quiere guardar son: "usuario=luis". No puede usar para esto la URL ya que entonces, cualquier persona que ponga en la barra de direcciones "usuario=luis" podría acceder a nuestra cuenta. Por la misma razón no puede usar cookies, ya que cualquier usuario sólo tendría que encontrar el archivo de su cookie y modificarla para que ponga "usuario=luis". Así que lo que le queda son las sesiones.

Mediante PHP el servidor web le asigna a este usuario un id de sesión (por ejemplo: "31d7bgphebfemb55311b1cger6"), crea en su sistema un archivo (en este ejemplo con el nombre "sess_31d7bgphebfemb55311b1cger6") y mete dentro "usuario=luis". Como este archivo no está en el ordenador del usuario, sino en el propio servidor, sólo puede ser modificado por el sitio web. Luego, el servidor le manda una cookie al navegador con nombre el nombre de la sesión (por defecto y para este ejemplo "PHPSESSID") y valor el id de sesión ("31d7bgphebfemb55311b1cger6").

Así, cuando el usuario vaya a otra página dentro del mismo sitio web, le mandará al servidor el valor de su cookie: "PHPSESSID=31d7bgphebfemb55311b1cger6" (este mismo efecto se puede conseguir utilizando la URL). De esta forma, el servidor sabe que el usuario es el que tiene id de sesión "31d7bgphebfemb55311b1cger6", así que va a buscar el archivo con sus datos ("sess_31d7bgphebfemb55311b1cger6") y se los pasa a la página web.

Si he explicado bien la mecánica de las sesiones, ahora estás preparado para el siguiente paso: comprender los ataques que se pueden dar contra las sesiones e intentar preveerlos. Pero eso será en próximos artículos. Ya tenemos algún artículo sobre el tema:

22 comentarios

aHoraComprendoTodo...

19/05/2018 23:25:06

ImpeKble!

Anónimo

04/05/2018 14:18:33

<p>Un buen articulo.</p>

AnónimoCrew

23/02/2018 02:19:24

util

Federico

07/11/2016 03:09:07

Usualmente no comento, pero en este caso tengo que decir que tu página es muy buena!

Anónimo

30/09/2016 23:03:38

Me fue muy util

Anónimo

25/02/2016 00:16:04

excelente informacion.

Roberto123

12/12/2015 06:56:18

Muy buena explicacion. Se agradece.

Anónimo

01/10/2015 23:26:55

Muy bueno. Agradecido!

marcelo

11/08/2015 20:18:00

esta genial

carlos

11/08/2015 20:17:39

esta super explicado

brayan

25/02/2015 16:44:28

super esta muy bien explicado muchas gracias

Luis

12/12/2013 13:19:37

Hola arian.

El directorio por defecto para las sesiones es compartido (será el directorio temporal del sistema operativo). Si estás en un hosting compartido lo estarán usando más usuarios. Si estás en un servidor virtual o dedicado, lo estarás usando solo tú.

Para ver qué directorio estás usando actualmente tienes que usar la función PHP session_save_path. Si la usas sin argumentos te devolverá la ruta actual. Si lo que quieres es poner un directorio privado, solo tienes que crear un directorio al que sólo puedas acceder tú (dentro de tu espacio de hosting, que no se pueda acceder desde http) y poner la ruta como argumento de la función session_save_path.

Un saludo.

Un saludo.

arian

02/12/2013 02:04:13

Muy interesante, ¿como hago para saber si el directorio en donde se almacenan las sessiones dentro del servidor es compartido o privado? en caso de que sea compartido, ¿existe alguna manera de volverlo privado?

Muchas gracias!

Anónimo

31/10/2013 16:02:18

buena explicacion, gracias por compartir

Anónimo

30/10/2013 23:38:44

Buena explicacion gracias ahora esta todo mas claro :)

abbyhr

05/07/2013 12:39:03

Muy buena explicación, gracias.

Anónimo

20/12/2012 17:42:25

quede un poco mas claro :)

Anónimo

29/09/2012 15:26:39

gracias por este esfuerzo

Anónimo

22/06/2012 18:27:02

gracias

Yhoni

23/01/2012 20:26:58

Gracias por compartir conocimientos.

rouse

10/11/2011 15:08:27

bastante didáctica la explicación

Anónimo

30/08/2011 04:15:56

En pocas palabras muy explìcito e instructivo. mil gracias . saludos.

Comentario anónimo
Comentar como usuario