Gestionar sesiones
Descripción del problema
El protocolo HTTP (HyperText Transfer Protocol) es un protocolo "sin estado". Es decir, no hay nada que permita identificar que el mismo usuario que ha estado previamente en la página A ahora está accediendo a la página B.
En cuanto a PHP, ahora sabemos que una variable tiene un ámbito de aplicación igual al script en el que está definida y que existe solo durante el tiempo de ejecución del script.
Sin embargo, un sitio interactivo que no se limita a mostrar las páginas una tras otra a menudo necesita el punto de vista de la lógica de aplicación para identificar a un usuario de una página a otra y mantener información relativa a este usuario de una página a otra (por lo general, un carro de la compra realizada por el usuario en una página siempre debe estar definido en la página de pago).
El término "sesión" designa el período de tiempo correspondiente a la navegación continua de un usuario en un sitio. «Gestionar sesiones» significa, por lo tanto, ser capaz de identificar el momento en que un nuevo usuario accede a una página del sitio y conservar la información relativa a ese usuario hasta que sale del sitio. El usuario no tiene por qué ser un usuario autenticado por medio de un nombre y una contraseña; puede ser perfectamente un usuario «anónimo»...
Autenticar
1. Información general
Algunos sitios necesitan autenticar a los usuarios que acceden a él para comprobar si están registrados.
Esta autenticación normalmente consta de dos pasos:
-
Introducción de las credenciales de usuario, por lo general un nombre y una contraseña.
-
Verificación de que las credenciales introducidas correspondan a un usuario registrado.
2. Introducir las credenciales de identificación
Las credenciales de identificación se pueden introducir de dos formas:
-
A través de un formulario previsto a tal efecto.
-
A través de las funciones de autenticación HTTP.
a. Identificación por formulario
Es muy sencillo crear un pequeño formulario que permita al usuario introducir un nombre y una contraseña.
Ejemplo de script PHP (login.php) que muestra este formulario (función de verificación de que el usuario existe, por el momento sin definir)
<?php
// Inclusión del archivo que contiene las funciones generales.
include('funciones.inc');
// Función que verifica que las credenciales de identificación
// introducidas son correctas.
function usuario_existe($identificador,$contraseña) {
// Aleatoria, esperando algo mejor...
return (bool) rand(0,1);
}
// Inicialización de las variables.
$identificador = '';
$contraseña = '';
$mensaje = '';
// Procesamiento del formulario.
if (isset($_POST['conexión'])) {
// Recuperar la información introducida.
$identificador = $_POST['identificador'];
$contraseña = $_POST['contraseña'];
// Verificar que el usuario existe.
if (usuario_existe($identificador,$contraseña)) {
// El usuario existe...
// Ir a otra página y detener
// el script.
header('location: inicio.php');
exit;
} else {
// El usuario no existe...
// Mostrar un mensaje y proponer de
...
Utilizar cookies
1. Principio
Una cookie (rastreador) es un pequeño archivo depositado por un sitio en el equipo del usuario que puede contener información.
Las cookies se reenvían automáticamente al servidor web por el navegador cuando el usuario navega por las páginas del sitio.
PHP permite recuperar muy fácilmente, en las variables, los datos almacenados en la cookie.
La función setcookie permite depositar una cookie en el equipo del usuario.
Sintaxis 1
booleano setcookie(cadena nombre [, cadena valor [, entero vencimiento [,
cadena ruta [, cadena dominio [, booleano asegurado[,
booleano http_únicamente]]]]]])
Donde
nombre |
Nombre de la cookie. |
valor |
Valor almacenado en la cookie. |
vencimiento |
Fecha de caducidad de la cookie (timestamp Unix). |
ruta |
Ruta de acceso en el servidor donde está disponible la cookie. Colocar / para hacer que la cookie esté disponible en todo el dominio o /rep/ para que la cookie esté disponible en el directorio /rep/ del dominio y todos sus subdirectorios. De forma predeterminada, igual al directorio desde donde se envió la cookie. |
dominio |
Dominio al que se reenvía la cookie. .miSitio.com (con un punto al principio) permite, por ejemplo, hacer que la cookie esté disponible para todos los subdominios de miSitio.com. |
asegurado |
Incluir TRUE para indicar que la cookie debe transmitirse únicamente en una conexión segura (por defecto, FALSE). |
http_únicamente |
Incluir TRUE para indicar que la cookie debe transmitirse únicamente por el protocolo HTTP (por defecto, FALSE). |
Sintaxis 2
booleano setcookie(cadeena nombre [, cadena valor [, mmatriz opciones]])
nombre |
Nombre de la cookie. |
valor |
Valor almacenado en la cookie. |
opciones |
Matriz asociativa que permite pasar las opciones de la cookie. Las claves permitidas son expires (fecha de expiración), path (ruta en el servidor donde la cookie está disponible), domain (dominio al que se envía la cookie), secure (indica si la cookie solo debe enviarse a través de una conexión segura), httponly (indica si la cookie solo debe transmitirse para el protocolo HTTP) y samesite. Los valores permitidos para la clave samesite son Strict (la cookie solo se reenvía al mismo sitio), Lax (la cookie también se envía en consultas de tipo GET) o None (ninguna restricción). En la primera sintaxis... |
Utilizar la gestión de sesiones de PHP
1. Principios
PHP ofrece un conjunto de funciones que facilitan la gestión de sesiones. Los principios son los siguientes:
-
Un identificador único se asigna automáticamente a cada sesión.
-
Este identificador único se transmite de una página a otra, bien mediante una cookie (si el equipo acepta cookies) o a través de la URL, en caso contrario; en cualquier caso, es PHP quien elige automáticamente el enfoque correcto y garantiza esta transferencia (con algunas reservas en relación con la configuración).
-
Los datos cuyo valor desea conservar de una página a otra mientras dure la sesión se indican a PHP, que se encarga automáticamente de devolver los valores al comienzo del script y guardarlos al final de este.
En resumen, PHP se encarga de toda la gestión.
2. Implementación
Las principales funciones del módulo de gestión de sesiones son las siguientes:
Nombre |
Función |
session_start |
Abre una nueva sesión o reactiva la sesión actual. |
session_id |
Devuelve (o modifica) el identificador de la sesión. |
session_name |
Devuelve (o modifica) el nombre de la variable utilizada para almacenar el identificador de la sesión. |
session_abort |
Anula las modificaciones efectuadas en los datos de sesión y termina la sesión. |
session_reset |
Reinicializa los datos de sesión a sus valores iniciales. |
session_destroy |
Elimina la sesión. |
session_status |
Devuelve el estado actual de una sesión. |
Además, la matriz $_SESSION permite manipular muy fácilmente los datos de sesión.
session_start
Sintaxis
booleano session_start([matriz options])
opciones |
Matriz asociativa que permite definir las opciones que reemplazarán a las directivas de configuración relativas a las sesiones (las claves son iguales a los nombres de las directivas sin el prefijo session.). |
La función session_start pregutará al entorno para detectar si el usuario actual ya ha iniciado una sesión. En caso afirmativo, las variables almacenadas en la sesión se restituyen. De lo contrario, se abre una nueva sesión con la asignación de un identificador.
La función session_start devuelve TRUE si se ha podido crear la sesión con éxito y FALSE en caso contrario.
Cualquier script que participe...
Conservar la información de una visita a otra
Si desea conservar la información sobre un usuario de una visita a otra (posiblemente muy distantes en el tiempo), hay dos soluciones predominantes:
-
Depositar una cookie en su equipo (preferiblemente, con su previo consentimiento).
-
Almacenar la información del lado del servidor (la opción más práctica es utilizar una base de datos) y asociar esa información con una identificación (por lo general, un nombre y una contraseña) que el usuario debe introducir en cada visita.
Algunos sitios utilizan una solución intermedia, elegante y fácil de usar; esta solución consiste en ofrecer al usuario depositar en su ordenador una cookie que contiene solo uno o dos datos que permiten el acceso automático al sitio (sin introducir un nombre ni una contraseña); la información adicional se recupera en una base de datos.
Vamos a ilustrar esta solución con la ayuda de dos páginas:
-
Una página de personalización (script personalizar.php) que permite al usuario activar o desactivar la conexión automática.
-
Una página de identificación (script login.php) que, según el caso, efectúa la conexión de forma automática o pide al usuario que se conecte.
Cada conexión del usuario es una sesión.
Fuente
-
Script personalizar.php:
<?php
// Inclusión del archivo que contiene las funciones generales.
include('funciones.inc');
// Abrir/reactivar la sesión.
session_start();
// Inicialización de las variables.
$mensaje = '';
// ¿La sesión se ha iniciado al nivel de la aplicación?
if (isset($_SESSION['identificador'])) { // sí
// Recuperar la información de sesión.
$identificador = $_SESSION['identificador'];
$contraseña = $_SESSION['contraseña'];
// ¿Se llama al script en el procesamiento del formulario?
if (isset($_POST['activar'])) { // sí
// Activar la conexión automática.
// Depositar dos cookies de un tiempo de vida de 30 días,
// una para el identificador...
Breve resumen de las variables Get/Post/Cookie/Session
Desde el comienzo de este libro, nos hemos encontrado con variables «especiales», relacionadas con datos del formulario, con datos transmitidos a través de una URL, con datos de una cookie o con datos de sesiones.
Hemos visto que estas variables funcionan bajo el mismo principio: son accesibles por medio de matrices asociativas $_GET, $_POST, $_COOKIE y $_SESSION. Además, la matriz asociativa $_REQUEST reagrupa el contenido de las matrices $_GET, $_POST y $_COOKIE.
La matriz $_REQUEST debe utilizarse con precaución, ya que contiene información proporcionada al script a través de varios mecanismos; no estamos necesariamente seguros de que la información leída llega por los medios esperados.
El hecho de que las matrices $_GET, $_POST y $_COOKIE se creen realmente depende de la directiva de configuración variables_order.
Esta directiva es una cadena compuesta por los caracteres G, P y C, que corresponden a los tipos ya mencionados, y de otros dos caracteres: E, correspondiente a las variables de entorno, y S, correspondiente a las variables del servidor HTTP. De forma predeterminada, la directiva variables_order es igual a EGPCS.
Las variables de entorno del sistema operativo y las variables del servidor HTTP están disponibles en el entorno PHP a través de las matrices asociativas $_ENV y $_SERVER.
El orden en el que las variables Get, Post...