Diferencia entre revisiones de «Plantilla:PHP/Inaem/Sesiones»

De WikiEducator
Saltar a: navegación, buscar
 
(20 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
<div class=parrafo>
 
<div class=parrafo>
{{Conocimiento previo|Title=¿Qué son las sesiones?|
+
 
*Una sesión es la conexión que se establece entre el cliente y servidor de forma continua.
+
===Las sesiones===
*Podríamos verla como una '''''conversación''''' entre dos partes.
+
<br />
*Normalmente durará mientras tenga abierto  el navegador que inició conversación con un determinado servidor.
+
{{MRM_Conocimiento previo|Title=¿Qué son las sesiones?|
*Durante ese tiempo puedo establecer variables cuyos valores estarán disponibles en el servidor para los diferentes '''scripts''' que ejecute solicitados por un determinado '''''cliente'''''.
+
*Una sesión es un mecanismo que permite mantener información entre distintas interacciones entre un cliente (navegador) y un servidor.
*Es una forma de hacer que variables estén disponibles en múltiples páginas.
+
*Podríamos verla como una '''''conversación''''' entre dos partes que se mantiene durante varias peticiones HTTP.
{{Tip| Por '''''cliente''''' siempre entendemos un determinado navegador con una ip concreta.}}
+
*HTTP es un protocolo '''''sin estado''''', lo que significa que cada petición es independiente y el servidor no recuerda las anteriores.
 +
*Durante una sesión se pueden establecer variables cuyos valores estarán disponibles en el servidor para los distintos '''scripts''' solicitados por el cliente.
 +
*Es una forma de hacer que variables estén disponibles en múltiples páginas de una aplicación web.
 +
{{Tip| Por '''''cliente''''' entendemos normalmente un navegador (o agente HTTP) que interactúa con el servidor.}}
 
}}
 
}}
 
  
 
{{MRM_Pregunta|Title=Por qué necesitamos sesiones|
 
{{MRM_Pregunta|Title=Por qué necesitamos sesiones|
;Porque la programación web está basado en http, un protocolo sin estado.
+
;Porque la programación web está basada en HTTP, un protocolo sin estado.
 
*Muchas veces '''''necesitamos''''' mantener valores de variables entre diferentes scripts invocados por un mismo cliente.
 
*Muchas veces '''''necesitamos''''' mantener valores de variables entre diferentes scripts invocados por un mismo cliente.
 
}}
 
}}
 +
 
===Ideas generales de las sesiones===
 
===Ideas generales de las sesiones===
  
Línea 20: Línea 23:
 
;Sabemos qué son las '''''cookies'''''.
 
;Sabemos qué son las '''''cookies'''''.
 
}}
 
}}
 +
 
<br />
 
<br />
* Tienen un tiempo limitado de existencia.
+
 
* Para identificar al usuario que generó las variables de sesión, el servidor genera una clave única que es enviada al navegador y almacenada en una '''''cookie'''''.
+
* Las sesiones tienen un tiempo limitado de existencia.
* Luego, cada vez que el navegador solicita otra página al mismo sitio, envía esta '''''cookie''''' (clave única) con la cual el servidor identifica de qué navegador proviene la petición y puede rescatar de un archivo de texto las variables de sesión que se han creado.
+
* Para identificar al usuario que generó las variables de sesión, el servidor crea una clave única llamada '''''SID (Session ID)'''''. 
* Cuando han pasado 20 minutos sin peticiones por parte de un cliente (navegador) las variables de sesión son eliminadas automáticamente (se puede configurar el entorno de PHP para variar este tiempo).
+
* Esta clave se envía al navegador y normalmente se almacena en una '''''cookie'''''.
* Una '''variable de sesión''' es más segura que una '''cookie''' ya que se almacena en el servidor.  
+
* Cada vez que el navegador solicita una nueva página al mismo sitio, envía esta '''''cookie''''' con el SID.
* No tiene que estar enviándose continuamente como sucede con las cookies.
+
* Con ese SID el servidor identifica al cliente y recupera las variables de sesión almacenadas.
* Cuando el navegador del cliente está configurado para desactivar las cookies las variables de sesión, tienen forma de funcionar (enviando la clave como parámetro en cada hipervínculo).
+
 
* Desventaja: ocupa espacio en el servidor.
+
* Normalmente los datos de sesión se guardan en '''archivos en el servidor''', aunque PHP permite utilizar otros sistemas de almacenamiento (memoria, bases de datos, etc.).
 +
 
 +
* Si una sesión permanece inactiva durante un tiempo determinado, PHP elimina automáticamente sus datos. 
 +
  Por defecto este tiempo suele ser de '''1440 segundos (24 minutos)''', aunque puede configurarse.
 +
 
 +
* Las '''variables de sesión''' son más seguras que las '''cookies''', ya que su contenido se almacena en el servidor y no es visible directamente para el cliente.
 +
 
 +
* El navegador únicamente envía el '''SID''' en cada petición, no el contenido completo de las variables.
 +
 
 +
* Desventaja: las sesiones ocupan espacio en el servidor, lo que puede ser un problema si existen muchas sesiones activas.
 +
 
 +
* Si el navegador tiene las cookies desactivadas, las sesiones normalmente no funcionarán correctamente.
  
 
{{MRM_Puntos clave|Title=Dónde se almacenan|
 
{{MRM_Puntos clave|Title=Dónde se almacenan|
;Las variables de sesión se almacenen en el servidor}}
+
;Las variables de sesión se almacenan en el servidor
 +
}}
 +
 
 +
===SID de la sesión===
 +
 
 +
Estas ideas son transparentes para el programador, no las tenemos que controlar directamente, pero conviene conocer cómo funcionan.
 +
 
 +
*Existen dos formas de mantener el '''SID''' de la sesión:
 +
 
 +
#Utilizando '''cookies''' (forma más habitual).
 +
#Propagando el SID como parámetro en la URL.
 +
 
 +
Ejemplo:
 +
 
 +
  http://www.misitioweb.com/tienda/listado.php?PHPSESSID=34534fg4ffg34ty
 +
 
 +
*En el ejemplo anterior, el SID es el valor del parámetro '''PHPSESSID'''.
 +
 
 +
En PHP todas estas acciones se realizan de forma transparente para el programador. 
 +
Como desarrolladores podemos utilizar directamente las sesiones mediante '''''supervariables''''' y '''''funciones'''''.
 +
 
 +
===Cómo funciona una sesión===
 +
 
 +
De forma simplificada el proceso es el siguiente:
 +
 
 +
#El cliente solicita una página al servidor.
 +
#El servidor crea una sesión y genera un '''SID'''.
 +
#El SID se envía al navegador (normalmente mediante una cookie).
 +
#En cada petición posterior el navegador envía ese SID al servidor.
 +
#El servidor utiliza el SID para recuperar los datos de la sesión.
  
===SSID de la sesión===
 
Estas ideas son transparentes para el programador, no las tenemos que controlar, pero por higiene intelectual en la programación web, conviene conocer que
 
*Existen dos maneras de mantener el SSID de la sesión
 
#Utilizando cookies, tema ya visto.
 
#Propagando el SID en un parámetro de la URL. El SID se añade como una parte más de la URL, de la forma:
 
  http://www.misitioweb.com/tienda/listado.php&PHPSESSID=34534fg4ffg34ty
 
*En el ejemplo anterior, el SID es el valor del parámetro PHPSESSID.
 
En php todas estas acciones se realizan de forma transparente para el programador, es decir, como desarrolladores podemos directamente utilizar las sesiones en php sin necesidad de tener que transmitir el SSID. Directemente '''php''' nos ofrece '''''supervariables''''' y '''''funciones''''' para gestionarlo.<br />
 
 
===Configuración===
 
===Configuración===
Existen una serie de '''''directivas''''' para configurar las sesiones, que conviene conocer. Como toda configuración tendemos a mantener su estado por defecto, lo cual es relativamente cómodo, pero no siempre práctico.
+
 
 +
Existen una serie de '''''directivas''''' para configurar las sesiones que conviene conocer.
 +
 
 
{{MRM_Pregunta|Title=Ubicación del fichero de configuración|
 
{{MRM_Pregunta|Title=Ubicación del fichero de configuración|
Dónde está el fichero de configuración de php.
+
¿Dónde está el fichero de configuración de PHP?
 
}}
 
}}
 +
 
<br />
 
<br />
*Estas se pueden consultar viendo phpinfo(), y modificar en el fichero de configuración de php, '''''php.ini'''''.
+
 
*Para ver todas las directivas http://es.php.net/manual/es/session.configuration.php
+
*Las directivas de configuración de sesiones pueden consultarse con la función `phpinfo()` y modificarse en el archivo de configuración de PHP '''php.ini'''.
*Algunas directivas de configuración que pueden resultar de interés:
+
 
 +
*Para ver todas las directivas:
 +
http://es.php.net/manual/es/session.configuration.php
 +
 
 +
Algunas directivas importantes son:
 +
 
 
;session.use_cookies
 
;session.use_cookies
:Indica si se deben usar cookies (1) o propagación en la URL (0) para almacenar el SID.
+
:Indica si se deben usar cookies (1) para almacenar el SID.
:session.use_only_cookies
+
 
:Se debe activar (1) cuando utilizas cookies para almacenar los SID, y además no quieres que se reconozcan los SID que se puedan pasar como parte de la URL (este método se puede usar para usurpar el identificador de otro usuario).
+
;session.use_only_cookies
 +
:Si se activa (1), se desactiva la propagación del SID en la URL
 +
:Esto mejora la seguridad evitando ataques como el '''session hijacking'''.
 +
 
 
;session.save_handler
 
;session.save_handler
:Se utiliza para indicar a PHP cómo debe almacenar los datos de la sesión del usuario. Existen cuatro opciones: en ficheros (files), en memoria (mm), en una base de datos SQLite (sqlite) o utilizando para ello funciones que debe definir el programador (user). El valor por defecto (files) funcionará sin problemas en la mayoría de los casos.
+
:Indica cómo se almacenan los datos de sesión.
 +
:El valor por defecto es '''files''' (archivos en el servidor).
 +
 
 
;session.name
 
;session.name
:Determina el nombre de la cookie que se utilizará para guardar el SID. Su valor por defecto es PHPSESSID.
+
:Nombre de la cookie que almacena el SID.
 +
:Por defecto es '''PHPSESSID'''.
 +
 
 
;session.auto_start
 
;session.auto_start
:Su valor por defecto es 0, y en este caso deberás usar la función '''''session_start()''''' para gestionar el inicio de las sesiones. Si usas sesiones en el sitio web, puede ser buena idea cambiar su valor a 1 para que PHP active de forma automática el manejo de sesiones. No obstante por seguridad mejor hacerlo de forma explícita cuando lo necesites.
+
:Si está activado (1), PHP inicia automáticamente una sesión en cada página. 
 +
:Normalmente se recomienda mantenerlo en '''0''' y utilizar la función '''session_start()''' de forma explícita.
 +
 
 
;session.cookie_lifetime
 
;session.cookie_lifetime
:Si utilizas la URL para propagar el SID, éste se perderá cuando cierres tu navegador. Sin embargo, si utilizas cookies, el SID se mantendrá mientras no se destruya la cookie. En su valor por defecto (0), las cookies se destruyen cuando se cierra el navegador. Si quieres que se mantenga el SID durante más tiempo, debes indicar en esta directiva ese tiempo en segundos.
+
:Indica cuánto tiempo vive la cookie de sesión.
 +
:Si vale '''0''', la cookie se elimina al cerrar el navegador.
 +
 
 
;session.gc_maxlifetime
 
;session.gc_maxlifetime
:Indica el tiempo en segundos que se debe mantener activa la sesión, aunque no haya ninguna actividad por parte del usuario. Su valor por defecto es 1440. Es decir, pasados 24 minutos desde la última actividad por parte del usuario, se cierra su sesión automáticamente.
+
:Indica el tiempo en segundos que los datos de sesión pueden permanecer inactivos antes de eliminarse.
 +
:Por defecto suele ser '''1440 segundos (24 minutos)'''.
 +
 
 
===Creando la sesión===
 
===Creando la sesión===
{{MRM_Definicion|Title=Qué es una de sesión|
+
[[Imagen:establecer_sesion.png|800px]]<br />
De forma coloquial
+
[[Imagen:almacenar_sesion.png|800px]]<br />
;Una sesión es la duración de la conexión que se establece entre un cliente (navegador/ip) y un servidor.
+
<br />
*Mientras dura la sesión puedo establecer variables de sesión y acceder a ellas.
+
 
*Si abro un navegador y accedo a un sitio web, se establece la sesión.
+
{{MRM_Definicion|Title=Qué es una sesión|
*Al cerrar el navegador se cierra la sesión (esto es en teoría).
+
De forma coloquial:
{{Tip|A veces se queda la sesión abierta por temas de cache o de la '''''cookie''''' que mantiene el id de sesión }}
+
 
 +
;Una sesión es un mecanismo que permite a un servidor recordar información entre varias peticiones de un mismo cliente.
 +
 
 +
*Mientras dura la sesión podemos almacenar variables y acceder a ellas.
 +
*Si abrimos un navegador y accedemos a un sitio web, el servidor puede crear una sesión.
 +
*Al cerrar el navegador normalmente se elimina la cookie de sesión (aunque los datos pueden permanecer en el servidor durante cierto tiempo).
 +
 
 +
{{Tip|En algunos casos la sesión puede permanecer activa durante un tiempo incluso después de cerrar el navegador.}}
 +
}}
 +
 
 
{{MRM_Ejemplo|Title=Comparación de qué es una sesión|
 
{{MRM_Ejemplo|Title=Comparación de qué es una sesión|
*Por comparación es como si entrara en un centro comercial
+
*Es como entrar en un centro comercial.
*Mientras en estoy en él estoy dentro de mi sesión
+
*Mientras estamos dentro seguimos en la misma "sesión".
*Cuando salgo se cierra la sesión
+
*Cuando salimos se termina.
*Mientra estoy dentro podrían mantener información a usar en diferentes tiendas (productos comprados, pe.).
+
*Mientras estamos dentro podrían mantener información sobre nosotros (por ejemplo productos que hemos añadido a la cesta).
}}
+
}}
 +
 
 
====Crear y usar una sesión====
 
====Crear y usar una sesión====
*Para usar sesiones, hay que especificarlo de forma explícita.
+
 
*En función de cómo esté configurado la directiva '''''session.auto_start'''''
+
*Para usar sesiones normalmente debemos iniciarlas de forma explícita.
*Si esta activada, la sesión comienza automáticamente al conectarse a un sitio
+
*Esto se hace mediante la función '''''session_start()'''''.
*Si no está activada la iniciaremos con la función '''''session_start()'''''. (Esta es la opción recomendada).
+
 
*Un vez creada la sesión establecemos la variable y su valor en la superglobal $_SESSION
+
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
sesion_start();
+
 
...
+
session_start();
$_SESSION['nombre']='manuel';
+
 
....
+
$_SESSION['nombre'] = 'manuel';
  
 
?>
 
?>
*Ahora hemos establecido la variable de sesión '''''nombre'''''.
+
</source>
*De esta forma en futuras navegaciones mientras dure la sesión o conversación entre el usuario cliente y el servidor podré acceder a la variable de sesion '''nombre''' puedo acceder.
+
 
*En otro fichero php podré acceder al valor del nombre del  usuario .
+
*Hemos creado la variable de sesión '''''nombre'''''.
 +
*Mientras dure la sesión, cualquier script podrá acceder a esa información.
 +
 
 +
En otro fichero PHP:
 +
 
 +
<source lang=php>
 
<?php
 
<?php
sesion_start();
+
 
...
+
session_start();
 +
 
 
$usuario = $_SESSION['nombre'];
 
$usuario = $_SESSION['nombre'];
....
 
  
 
?>
 
?>
 
 
</source>
 
</source>
{{Tip|Una vez creada la sesión podemos almacenar/consultar información de la misma consultando la variable superglobal '''''$_SESSION'''''}}
 
  
 +
{{Tip|'''$_SESSION''' es un array asociativo que permite almacenar información durante la sesión del usuario.}}
  
 
===Eliminando la sesión===
 
===Eliminando la sesión===
*Se puede configurar para que de forma automática se eliminen los datos de una sesión pasados un determinado tiempo
 
*También podemos actuar directamente sobre una sesión eliminando información
 
;session_unset.
 
:Elimina las variables almacenadas en la sesión actual, pero no elimina la información de la sesión del dispositivo de almacenamiento usado.
 
;session_destroy.
 
Elimina completamente la información de la sesión del dispositivo de almacenamiento.
 
{{Tip| Cuando se hace un cambio de estado (login, cambio de permisos, ...): regenerar id.
 
  session_regenerate_id()
 
}}
 
  
 +
*Las sesiones pueden eliminarse automáticamente tras un tiempo de inactividad.
 +
*También podemos eliminarlas manualmente.
  
{{Lectura|Title=Documentación|
+
;session_unset
* http://www.php.net/manual/es/booSek.session.php
+
:Elimina las variables almacenadas en la sesión actual.
 +
 
 +
;session_destroy
 +
:Elimina completamente los datos de la sesión.
 +
 
 +
{{Tip|
 +
Cuando se produce un cambio de estado importante (por ejemplo un login), es recomendable regenerar el identificador de sesión:
 +
 
 +
session_regenerate_id();
 +
 
 +
Esto ayuda a evitar ataques de '''session fixation'''.
 +
}}
 +
 
 +
{{MRM_Lectura|Title=Documentación|
 +
* http://www.php.net/manual/es/book.session.php
 
* http://www.w3schools.com/php/php_sessions.asp
 
* http://www.w3schools.com/php/php_sessions.asp
 
* http://www.mclibre.org/consultar/php/lecciones/php_sesiones.html
 
* http://www.mclibre.org/consultar/php/lecciones/php_sesiones.html
 
}}
 
}}
 +
 
===Actividades===
 
===Actividades===
{{MRM_Actividad|Title=Contador de accesos a una página|
+
<br />
*Haz un programa que cuente el número de visitas a una página en una misma sesión
+
*A la página podremos acceder por la url o haciendo un click en un botón de tipo submit
+
<!--[[Usuario:ManuelRomero/ProgramacionWeb/php/Aut_Ses_Coo/ejercicios#Cuenta de visitas|Cuenta Visitas]]-->
+
}}
+
{{MRM_Actividad|Title=Contador de acceso a un usuario|
+
*En este caso queremos contar cuantas veces accede un determinado usuario a nuestra página
+
*El programa visualizará en cada acceso el número total de accesos de cada usuario, indicando su nombre y número de acceso.
+
<!--[[Usuario:ManuelRomero/ProgramacionWeb/php/Aut_Ses_Coo/ejercicios#Cuenta de visitas|Cuenta Visitas]]-->
+
}}
+
{{Actividad|Title = Programa una pequeña agenda|
+
*Es una  aplicación para mantener una pequeña agenda en una '''''única''''' página web programada en PHP.
+
  
*La agenda almacenará únicamente dos datos de cada persona: su nombre y un número de teléfono. Además, no podrá haber nombres repetidos en la agenda.
+
{{MRM_Actividad|Title=Registro de acceso|
 +
*Vamos a simular un sitio web con autenticación por base de datos.
 +
*Siguiendo el esquema que se muestra
  
*En la parte superior de la página web se mostrará el contenido de la agenda. En la parte inferior debe figurar un sencillo formulario con dos cuadros de texto, uno para el nombre y otro para el número de teléfono.
+
[[Archivo:app_logueo1.png|800px|center]]
  
*Cada vez que se envíe el formulario:
+
*Al abrir la aplicación se nos pedirá que nos logueemos (usuario y password).
 +
*Debe existir una base de datos llamada '''''dwes''''' con una tabla llamada '''''usuarios''''' que tenga dos campos: '''usuario''' y '''pass'''.
 +
*Crea un fichero SQL que genere la tabla y añada un usuario con los valores '''dwes''' y '''abc123.'''.
  
#Si el nombre está vacío, se mostrará una advertencia.
+
[[Archivo:tabla_usuarios.png]]
#Si el nombre que se introdujo no existe en la agenda, y el número de teléfono no está vacío, se añadirá a la agenda.
+
#Si el nombre que se introdujo ya existe en la agenda y se indica un número de teléfono, se sustituirá el número de teléfono anterior.
+
#Si el nombre que se introdujo ya existe en la agenda y no se indica número de teléfono, se eliminará de la agenda la entrada correspondiente a ese nombre.
+
}}
+
{{MRM_Actividad|Title=Control de acceso|
+
*En este caso queremos mostrar un formulario con nombre y password ("alumno", "password")
+
*Dejamos solamente 3 intentos seguidos para acceder
+
*En caso de el intento sea incorrecto, mostraremos un mensaje "Datos incorrectos, le quedan X intentos"
+
*En caso de que insertemos correctamente iremos a una página llamado sitio.php donde mostraremos un mensaje de bienvenida y el nombre de la persona que accede
+
*Será posible navegar a una segunda página llamada productos.php donde se mostrará otro mensaje con el nombre del usuario
+
*Desde la segunda página se podrá cerrar sesión, en cuyo caso deberemos de pasar a la primer página
+
*Estas dos páginas solo deberá de ser posible acceder si nos hemos logueado, si no, no nos dejará, mostrando un mensaje y reenviándonos a la página index.php en 3 segundos.
+
{{Plegable|hide|Css para el login|
+
<source lang=css>
+
#login fieldset {
+
    position: absolute;
+
    left: 50%;
+
    top: 50%;
+
    width: 230px;
+
    margin-left: -115px;
+
    height: 160px;
+
    margin-top: -80px;
+
    padding:10px;
+
    border:1px solid #ccc;
+
    background-color: #eee;
+
}
+
  
#login legend {
+
*Al pulsar '''''Validar''''' comprobaremos si existe un registro con esos valores.
    font-family : Arial, sans-serif;
+
*Si no existe, permaneceremos en la misma pantalla mostrando el mensaje '''''Datos incorrectos'''''.
    font-size: 1.3em;
+
*Si es correcto, iremos a la pantalla '''''sitio1.php'''''.
    font-weight:bold;
+
    color:#333;
+
}
+
</source>}}
+
}}
+
  
 +
*Desde ahí podremos ir a '''''sitio2.php''''' o bien '''''desconectar'''''.
  
 +
*Utilizaremos la variable de sesión:
  
 +
  $_SESSION['usuario']
  
 +
para comprobar si el usuario está autenticado.
 +
 +
*Si se intenta acceder directamente a '''''sitio1.php''''' o '''''sitio2.php''''' sin estar logueado, se redirigirá a '''''index.php''''' mostrando el mensaje '''''Debes loguearte'''''.
 
}}
 
}}
 
 
 
</div>
 
</div>

Última revisión de 18:32 4 mar 2026

Las sesiones



Icon preknowledge.gif
¿Qué son las sesiones?
  • Una sesión es un mecanismo que permite mantener información entre distintas interacciones entre un cliente (navegador) y un servidor.
  • Podríamos verla como una conversación entre dos partes que se mantiene durante varias peticiones HTTP.
  • HTTP es un protocolo sin estado, lo que significa que cada petición es independiente y el servidor no recuerda las anteriores.
  • Durante una sesión se pueden establecer variables cuyos valores estarán disponibles en el servidor para los distintos scripts solicitados por el cliente.
  • Es una forma de hacer que variables estén disponibles en múltiples páginas de una aplicación web.
Icon present.gif
Tip: Por cliente entendemos normalmente un navegador (o agente HTTP) que interactúa con el servidor.






Icon qmark.gif
Por qué necesitamos sesiones
Porque la programación web está basada en HTTP, un protocolo sin estado.
  • Muchas veces necesitamos mantener valores de variables entre diferentes scripts invocados por un mismo cliente.



Ideas generales de las sesiones

  • A diferencia de las cookies, las variables de sesión se almacenan en el servidor.



Icon qmark.gif
Cookies
Sabemos qué son las cookies.




  • Las sesiones tienen un tiempo limitado de existencia.
  • Para identificar al usuario que generó las variables de sesión, el servidor crea una clave única llamada SID (Session ID).
  • Esta clave se envía al navegador y normalmente se almacena en una cookie.
  • Cada vez que el navegador solicita una nueva página al mismo sitio, envía esta cookie con el SID.
  • Con ese SID el servidor identifica al cliente y recupera las variables de sesión almacenadas.
  • Normalmente los datos de sesión se guardan en archivos en el servidor, aunque PHP permite utilizar otros sistemas de almacenamiento (memoria, bases de datos, etc.).
  • Si una sesión permanece inactiva durante un tiempo determinado, PHP elimina automáticamente sus datos.
 Por defecto este tiempo suele ser de 1440 segundos (24 minutos), aunque puede configurarse.
  • Las variables de sesión son más seguras que las cookies, ya que su contenido se almacena en el servidor y no es visible directamente para el cliente.
  • El navegador únicamente envía el SID en cada petición, no el contenido completo de las variables.
  • Desventaja: las sesiones ocupan espacio en el servidor, lo que puede ser un problema si existen muchas sesiones activas.
  • Si el navegador tiene las cookies desactivadas, las sesiones normalmente no funcionarán correctamente.



Icon key points.gif

Dónde se almacenan

Las variables de sesión se almacenan en el servidor



SID de la sesión

Estas ideas son transparentes para el programador, no las tenemos que controlar directamente, pero conviene conocer cómo funcionan.

  • Existen dos formas de mantener el SID de la sesión:
  1. Utilizando cookies (forma más habitual).
  2. Propagando el SID como parámetro en la URL.

Ejemplo:

 http://www.misitioweb.com/tienda/listado.php?PHPSESSID=34534fg4ffg34ty
  • En el ejemplo anterior, el SID es el valor del parámetro PHPSESSID.

En PHP todas estas acciones se realizan de forma transparente para el programador. Como desarrolladores podemos utilizar directamente las sesiones mediante supervariables y funciones.

Cómo funciona una sesión

De forma simplificada el proceso es el siguiente:

  1. El cliente solicita una página al servidor.
  2. El servidor crea una sesión y genera un SID.
  3. El SID se envía al navegador (normalmente mediante una cookie).
  4. En cada petición posterior el navegador envía ese SID al servidor.
  5. El servidor utiliza el SID para recuperar los datos de la sesión.

Configuración

Existen una serie de directivas para configurar las sesiones que conviene conocer.



Icon qmark.gif
Ubicación del fichero de configuración

¿Dónde está el fichero de configuración de PHP?




  • Las directivas de configuración de sesiones pueden consultarse con la función `phpinfo()` y modificarse en el archivo de configuración de PHP php.ini.
  • Para ver todas las directivas:

http://es.php.net/manual/es/session.configuration.php

Algunas directivas importantes son:

session.use_cookies
Indica si se deben usar cookies (1) para almacenar el SID.
session.use_only_cookies
Si se activa (1), se desactiva la propagación del SID en la URL.
Esto mejora la seguridad evitando ataques como el session hijacking.
session.save_handler
Indica cómo se almacenan los datos de sesión.
El valor por defecto es files (archivos en el servidor).
session.name
Nombre de la cookie que almacena el SID.
Por defecto es PHPSESSID.
session.auto_start
Si está activado (1), PHP inicia automáticamente una sesión en cada página.
Normalmente se recomienda mantenerlo en 0 y utilizar la función session_start() de forma explícita.
session.cookie_lifetime
Indica cuánto tiempo vive la cookie de sesión.
Si vale 0, la cookie se elimina al cerrar el navegador.
session.gc_maxlifetime
Indica el tiempo en segundos que los datos de sesión pueden permanecer inactivos antes de eliminarse.
Por defecto suele ser 1440 segundos (24 minutos).

Creando la sesión

Establecer sesion.png
Almacenar sesion.png



Icon define.gif
Qué es una sesión

De forma coloquial:

Una sesión es un mecanismo que permite a un servidor recordar información entre varias peticiones de un mismo cliente.
  • Mientras dura la sesión podemos almacenar variables y acceder a ellas.
  • Si abrimos un navegador y accedemos a un sitio web, el servidor puede crear una sesión.
  • Al cerrar el navegador normalmente se elimina la cookie de sesión (aunque los datos pueden permanecer en el servidor durante cierto tiempo).
Icon present.gif
Tip: En algunos casos la sesión puede permanecer activa durante un tiempo incluso después de cerrar el navegador.





Icon casestudy.gif
Comparación de qué es una sesión
  • Es como entrar en un centro comercial.
  • Mientras estamos dentro seguimos en la misma "sesión".
  • Cuando salimos se termina.
  • Mientras estamos dentro podrían mantener información sobre nosotros (por ejemplo productos que hemos añadido a la cesta).



Crear y usar una sesión

  • Para usar sesiones normalmente debemos iniciarlas de forma explícita.
  • Esto se hace mediante la función session_start().
<?php
 
session_start();
 
$_SESSION['nombre'] = 'manuel';
 
?>
  • Hemos creado la variable de sesión nombre.
  • Mientras dure la sesión, cualquier script podrá acceder a esa información.

En otro fichero PHP:

<?php
 
session_start();
 
$usuario = $_SESSION['nombre'];
 
?>
Icon present.gif
Tip: $_SESSION es un array asociativo que permite almacenar información durante la sesión del usuario.


Eliminando la sesión

  • Las sesiones pueden eliminarse automáticamente tras un tiempo de inactividad.
  • También podemos eliminarlas manualmente.
session_unset
Elimina las variables almacenadas en la sesión actual.
session_destroy
Elimina completamente los datos de la sesión.
Icon present.gif
Tip:

Cuando se produce un cambio de estado importante (por ejemplo un login), es recomendable regenerar el identificador de sesión:

session_regenerate_id();

Esto ayuda a evitar ataques de session fixation.





Actividades




Icon activity.jpg
Registro de acceso
  • Vamos a simular un sitio web con autenticación por base de datos.
  • Siguiendo el esquema que se muestra
App logueo1.png
  • Al abrir la aplicación se nos pedirá que nos logueemos (usuario y password).
  • Debe existir una base de datos llamada dwes con una tabla llamada usuarios que tenga dos campos: usuario y pass.
  • Crea un fichero SQL que genere la tabla y añada un usuario con los valores dwes y abc123..

Tabla usuarios.png

  • Al pulsar Validar comprobaremos si existe un registro con esos valores.
  • Si no existe, permaneceremos en la misma pantalla mostrando el mensaje Datos incorrectos.
  • Si es correcto, iremos a la pantalla sitio1.php.
  • Desde ahí podremos ir a sitio2.php o bien desconectar.
  • Utilizaremos la variable de sesión:
 $_SESSION['usuario']

para comprobar si el usuario está autenticado.

  • Si se intenta acceder directamente a sitio1.php o sitio2.php sin estar logueado, se redirigirá a index.php mostrando el mensaje Debes loguearte.