Sesiones, autenticación y control de acceso

per Victor Carceler darrera modificació 2020-03-25T15:28:25+01:00

El protocolo HTTP es un protocolo sin estado, esto quiere decir que cada petición de un navegador a un servidor web es independiente de las anteriores. Sin embargo las aplicaciones web utilizan sesiones, por ejemplo, para poder distinguir los accesos de un usuario autentificado o bien enviar una respuesta personalizada.

Una sesión permite agrupar un conjunto de peticiones relacionadas como las que realiza un usuario mientras lee su correo en a través de un webmail. Para implementar sesiones web se suele hacer uso de cookies o reescritura de URLs (index.php?session_id=AF3456GHJKL987GGFDFY78872ET).

Cookies

Son bloques de información enviados por el servidor web y guardados en el navegador del usuario. El navegador los mostrará al servidor en las sucesivas peticiones siempre que concuerden parámetros como el dominio, camino, y/o esté disponible una conexión https. Tienen fecha de expiración y no se deberían utilizar una vez alcanzada. Las llamadas cookies de sesión caducan cuando se cierra el navegador.

Atributos:

  • domain: Por ejemplo elpuig.xeill.net. La cookie solo se enviará de vuelta al navegador para peticiones de este dominio o uno de sus subdominios.
  • path: Por ejemplo /ventas. Si se especifica solo se enviará la cookie al servidor para peticiones que comiencen con esta ruta.
  • expires: Fecha de caducidad para la cookie. Si no se especifica se trata de una cookie de sesión que se borrará al cerrar el navegador.
  • secure: Si está activo solo se transmitirá la cookie a través de una comunicación https.

En PHP hay soporte para cookies, de manera que es posible tanto insertar cookies en el navegador del usuario como comprobar las que el navegador presenta. Debe tenerse en cuenta que puesto que el servidor inserta cookies a través de las cabeceras http, cuando se quiere insertar una cookie en PHP debe hacerse antes de generar cualquier salida.

Sesiones

PHP permite el uso de sesiones aún cuando el navegador del usuario no acepta cookies, en este caso se utiliza la reescritura de URLs.

La función session_start() permite iniciar una nueva sesión o recuperar la existente, puesto que utiliza las cabeceras HTTP debe ser invocada antes de que se genere cualquier salida hacia el navegador. Cuando se utilizan sesiones la variable superglobal $_SESSION mantendrá sus valores a través de cada sesión.

En este ejemplo se puede ver que pagina1.php establece unas variables de sesión:

<?php
// pagina1.php

session_start();

echo 'Bienvenido a la página #1';

$_SESSION['color']  = 'verde';
$_SESSION['animal'] = 'gato';
$_SESSION['time']   = time();

// Trabajar si la cookie de sesión fue aceptada
echo '<br /><a href="pagina2.php">página 2</a>';

// O quizás pasar el id de sesión, si fuera necesario
echo '<br /><a href="pagina2.php?' . SID . '">página 2</a>';
?>

y pagina2.php puede acceder a ellas:

<?php
// pagina2.php

session_start();

echo 'Bienvenido a la página #2<br />';

echo $_SESSION['color'];  // verde
echo $_SESSION['animal']; // gato
echo date('Y m d H:i:s', $_SESSION['time']);

// Puede querer usar SID aquí, como hicimos en pagina1.php
echo '<br /><a href="pagina1.php">página 1</a>';
?>

Autenticación y control de acceso

Aunque los servidores web incluyen soporte para configurar la autenticación y el control de acceso, la mayoría de las aplicaciones web implementan su propio mecanismo. En general, la autenticación se puede basar en algo que se tiene (como una llave), algo que se conoce (como un secreto) o algo que se es (como cualquier parámetro biométrico). En el caso de las aplicaciones web la autenticación se realiza típicamente mediante un login/password.

Una vez que se ha superado la autenticación, se utilizarán las sesiones para guardar alguna variable indicando que se trata de un usuario válido, y posiblemente de qué usuario en concreto.