Hola, somos Arume

Desarrollamos páginas web, aplicaciones para móviles, capas de realidad aumentada y aplicaciones para Facebook. Nos apasiona la informática y somos unos perfeccionistas incurables; por eso en nuestros proyectos utilizamos estándares.

tel. 625 519 694

Mendaña de Neyra, 34, 3º B, 15008, A Coruña

Autenticarse

Registrarse. ¿Has olvidado tu contraseña?

Etiquetas

Saltar las etiquetas

Suscríbete a las RSS

Estás en:

  • Inicio >
  • Blog >
  • Sesiones en PHP: qué son y cómo funcionan

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

19 Nov 2010 por Luis

Comentarios: 19

Descubre las sesiones

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:

Comentarios

19 comentarios. Comentar.

1. Anónimo el 30 Ago 2011 a las 04:15:56

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

2. rouse el 10 Nov 2011 a las 15:08:27

bastante didáctica la explicación

3. Yhoni el 23 Ene 2012 a las 20:26:58

Gracias por compartir conocimientos.

4. Anónimo el 22 Jun 2012 a las 18:27:02

gracias

5. Anónimo el 29 Sep 2012 a las 15:26:39

gracias por este esfuerzo

6. Anónimo el 20 Dic 2012 a las 17:42:25

quede un poco mas claro :)

7. abbyhr el 05 Jul 2013 a las 12:39:03

Muy buena explicación, gracias.

8. Anónimo el 30 Oct 2013 a las 23:38:44

Buena explicacion gracias ahora esta todo mas claro :)

9. Anónimo el 31 Oct 2013 a las 16:02:18

buena explicacion, gracias por compartir

10. arian el 02 Dic 2013 a las 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!

11. Luis el 12 Dic 2013 a las 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.

12. brayan el 25 Feb 2015 a las 16:44:28

super esta muy bien explicado muchas gracias

13. carlos el 11 Ago 2015 a las 20:17:39

esta super explicado

14. marcelo el 11 Ago 2015 a las 20:18:00

esta genial

15. Anónimo el 01 Oct 2015 a las 23:26:55

Muy bueno. Agradecido!

16. Roberto123 el 12 Dic 2015 a las 06:56:18

Muy buena explicacion. Se agradece.

17. Anónimo el 25 Feb 2016 a las 00:16:04

excelente informacion.

18. Anónimo el 30 Sep 2016 a las 23:03:38

Me fue muy util

19. Federico el 07 Nov 2016 a las 03:09:07

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

Comentar

Comentar de forma anónima

Puedes comentar poniendo cualquier nombre o apodo, exceptuando los nombres de usuarios registrados. Máximo de 50 caracteres.

Comentar como usuario registrado

Registrarse. ¿Has olvidado tu contraseña?