Usuario:ManuelRomero/ProgramacionWeb/INAEM2017/Sesiones

De WikiEducator
Saltar a: navegación, buscar

DWES TituloTema7 2.png

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.