Ola, somos Arume

Desenvolvemos páxinas web, aplicacións para móbiles, capas de realidade aumentada e aplicacións para Facebook. Apaixónanos a informática e somos uns perfeccionistas incurables; por eso nos nosos proxectos utilizamos estándares.

tel. 625 519 694

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

Autenticarse

Rexistrarse. Esqueceches o teu contrasinal?

Etiquetas

Saltar as etiquetas

Subscríbete ás RSS

Estás en:

  • Inicio >
  • Blog >
  • Sesións en PHP: que son e como funcionan

Sesións en PHP: que son e como funcionan

19 Nov 2010 por Luis

Comentarios: 19

Descubre as sesións

En este artigo intentarei explicar, da forma máis simple posible, que son as sesións en PHP, como funcionan e como as implementa o servidor web. O obxectivo deste artigo non é explicar como usar sesións, senón comprender a mecánica do funcionamento, para entender como actúan os ataques contra elas.

Este artigo está orientado a xente con poucos coñecementos sobre o tema, así que en ocasións simplificarei certos detalles sabendo que o que digo é só media verdade (como cando che ensinaban que non existía a raíz cadrada dun número negativo).

Antecedentes

O protocolo que utiliza a web (HTTP) é un protocolo sen estado, é dicir, que non garda ningunha información sobre conexións anteriores: non sabe en que páxina web estiveches antes nin se xa enviaches datos ó sitio web. O único que coñece a páxina web son os datos que lle chegan a través da URL.

Dado que algunhas páxinas web querían poder recoñecer ós visitantes e gardar datos dos mesmos dunha conexión a outra sen ter que ir arrastrando un montón de parámetros na URL, inventáronse as xa famosas cookies. Unha cookie é un fragmento de información que se garda no ordenador do usuario e que está asociado ó navegador co que visitou a páxina web. Esto quere decir que cada navegador garda as súas propias cookies e non as comparte con outros navegadores. A forma na que se garda esta información depende do navegador, aínda que moitos almacénanas como arquivos de texto nun directorio dado.

Cando un navegador vai a abrir unha páxina web, se ten algunha cookie gardada asociada a ese sitio web (en realidade, a ese dominio), colle os datos da mesma e mandaos ó servidor web xunto coa petición da páxina.

O sitio web que pon unha cookie, tamén lle di ó navegador ata cando debe durar (como máximo) a mesma: dende "ata que se peche o navegador" ata calquera cantidade de tempo. Un dominio só pode acceder ás cookies que puxo el mesmo no navegador, é decir, un dominio non pode acceder ás cookies de outros dominios.

Vexamos un exemplo: poñamos que temos un sitio web multi-idioma e que no momento en que escollamos un idioma distinto este quere recordalo, para servirnos sempre as súas páxinas web en el. Entón, o que faría sería enviarlle unha cookie ó noso navegador, con nome "idioma" e datos "galego". O navegador creará un arquivo para esa cookie e gardará dentro os datos. Cando o usuario faga unha nova petición de páxina web, o navegador mandaría algo así: "idioma=galego".

Que son as sesións en PHP?

Resumindo, as formas que ten un sitio web para propagar datos sobre un visitante son: a URL ou as cookies. O problema con ambos recursos é que son facilmente modificables polo usuario: a URL pódese cambiar directamente na barra de direccións do navegador e as cookies, ó ser datos no ordenador do usuario, tamén poden ser modificadas.

Así que, para gardar datos máis críticos, necesitábase un método que non fora modificable polos usuarios (para evitar que, por exemplo, un usuario autenticado se fixera pasar por outro). Así naceron as sesións.

Unha sesión en PHP é unha serie de caracteres aleatorios que forman unha identificación única para cada visitante (á que chamaremos "id de sesión"). Cando a un usuario se lle asigna un id de sesión, o servidor web crea un arquivo no seu sistema onde irá introducindo todos os datos que queiramos gardar. Pero, ¿como recoñece o sitio web ó usuario en sucesivas conexións? Pois usando algún dos dous métodos anteriores; esto é, facendo que o usuario lle mande na URL o seu id de sesión ou enviándolle unha cookie co mesmo e cunha duración de "ata que se peche o navegador".

Como funcionan as sesións en PHP?

Mellor explicámolo cun exemplo: acabamos de autenticarnos nunha páxina co noso usuario (luis) e contrasinal (******). O sitio web comproba que efectivamente son correctos e quere poder recoñecernos nas seguintes conexións. Os datos que quere gardar son: "usuario=luis". Non pode usar para esto a URL xa que entón, calquera persona que poña na barra de direccións "usuario=luis" podería acceder á nosa conta. Pola mesma razón non pode usar cookies, xa que calquera usuario só tería que encontrar o arquivo da súa cookie e modificala para que poña "usuario=luis". Así que o que lle queda son as sesións.

Mediante PHP o servidor web asignalle a este usuario un id de sesión (por exemplo: "31d7bgphebfemb55311b1cger6"), crea no seu sistema un arquivo (neste exemplo co nome "sess_31d7bgphebfemb55311b1cger6") e mete dentro "usuario=luis". Como este arquivo non está no ordenador do usuario, senón no propio servidor, só pode ser modificado polo sitio web. Logo, o servidor mándalle unha cookie ó navegador con nome o nome da sesión (por defecto e para este exemplo "PHPSESSID") e valor o id de sesión ("31d7bgphebfemb55311b1cger6").

Así, cando o usuario vaia a outra páxina dentro do mesmo sitio web, mandaralle ó servidor o valor da súa cookie: "PHPSESSID=31d7bgphebfemb55311b1cger6" (este mesmo efecto pode conseguirse utilizando a URL). Desta forma, o servidor sabe que o usuario é o que ten id de sesión "31d7bgphebfemb55311b1cger6", así que vai buscar o arquivo cos seus datos ("sess_31d7bgphebfemb55311b1cger6") e pásallos á páxina web.

Se expliquei ben a mecánica das sesións, agora estás preparado para o seguinte paso: comprender os ataques que se poden dar contra as sesións e intentar prevelos. Pero eso será en próximos artigos. Xa temos algún artigo sobre o tema:

Comentarios

19 comentarios. Comentar.

1. Anónimo o 30 Ago 2011 ás 04:15:56

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

2. rouse o 10 Nov 2011 ás 15:08:27

bastante didáctica la explicación

3. Yhoni o 23 Xan 2012 ás 20:26:58

Gracias por compartir conocimientos.

4. Anónimo o 22 Xuñ 2012 ás 18:27:02

gracias

5. Anónimo o 29 Set 2012 ás 15:26:39

gracias por este esfuerzo

6. Anónimo o 20 Dec 2012 ás 17:42:25

quede un poco mas claro :)

7. abbyhr o 05 Xul 2013 ás 12:39:03

Muy buena explicación, gracias.

8. Anónimo o 30 Out 2013 ás 23:38:44

Buena explicacion gracias ahora esta todo mas claro :)

9. Anónimo o 31 Out 2013 ás 16:02:18

buena explicacion, gracias por compartir

10. arian o 02 Dec 2013 ás 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 o 12 Dec 2013 ás 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 o 25 Feb 2015 ás 16:44:28

super esta muy bien explicado muchas gracias

13. carlos o 11 Ago 2015 ás 20:17:39

esta super explicado

14. marcelo o 11 Ago 2015 ás 20:18:00

esta genial

15. Anónimo o 01 Out 2015 ás 23:26:55

Muy bueno. Agradecido!

16. Roberto123 o 12 Dec 2015 ás 06:56:18

Muy buena explicacion. Se agradece.

17. Anónimo o 25 Feb 2016 ás 00:16:04

excelente informacion.

18. Anónimo o 30 Set 2016 ás 23:03:38

Me fue muy util

19. Federico o 07 Nov 2016 ás 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

Podes comentar poñendo calquera nome ou alcume, exceptuando os nomes de usuarios rexistrados. Máximo de 50 caracteres.

Comentar como usuario rexistrado

Rexistrarse. Esqueceches o teu contrasinal?