PHP

PHP

Tutorial PHP: Concepto de sesiones en PHP

PHP y gestión de sesiones: superando el protocolo HTTP sin estado para personalizar experiencias web mediante `session_start()` y `session_destroy()`.

Aprende PHP GRATIS y certifícate

Por qué son necesarias las sesiones (estado en aplicaciones web)

En el contexto del desarrollo de aplicaciones web, uno de los desafíos más importantes es la gestión del estado entre las distintas peticiones que realiza un usuario. El protocolo HTTP es por naturaleza sin estado (stateless), lo que significa que cada solicitud que un cliente realiza al servidor es independiente y no tiene relación con las anteriores ni con las siguientes. Esto implica que, sin mecanismos adicionales, el servidor no puede recordar información sobre usuarios o acciones previas, afectando la continuidad y personalización de la experiencia del usuario.

Las sesiones son la solución a este problema, ya que permiten mantener información persistente a lo largo de múltiples interacciones entre el cliente y el servidor. A través de las sesiones, es posible asociar datos específicos a un usuario durante un periodo de tiempo, lo que es esencial para funcionalidades como autenticación, carritos de compra, preferencias de usuario y otras características que requieren recordar el estado previo del usuario.

Por ejemplo, en un sitio web de comercio electrónico, es fundamental que el sistema pueda recordar los productos que un usuario ha agregado a su carrito de compras mientras navega por diferentes páginas. Sin el uso de sesiones, el servidor no tendría forma de identificar al usuario ni de mantener el estado de su carrito, lo que resultaría en una experiencia de usuario deficiente.

Sin el uso de sesiones, intentar almacenar información entre solicitudes es inútil. Considere el siguiente ejemplo en PHP:

<?php
$count = 0;
$count++;
echo "El contador es: $count\n";

Cada vez que se accede a este script, el valor de $count se inicializa en cero y luego se incrementa en uno, mostrando siempre El contador es: 1. Esto ocurre porque la variable $count no persiste entre solicitudes, ya que cada petición es independiente y no mantiene el estado previo.

Las sesiones funcionan asignando un identificador único de sesión (generalmente almacenado en una cookie en el lado del cliente) que se envía al servidor con cada solicitud. Este identificador permite al servidor acceder a los datos almacenados en la sesión del usuario y mantener la continuidad del estado a través de las interacciones.

Por lo tanto, las sesiones son esenciales en las aplicaciones web para superar la naturaleza sin estado del protocolo HTTP y proporcionar una experiencia de usuario coherente y personalizada. Sin ellas, sería extremadamente difícil implementar funcionalidades comunes y esenciales en aplicaciones web modernas.

Inicio y cierre de sesiones (session_start(), session_destroy())

Para gestionar sesiones en PHP, es esencial iniciar la sesión en cada script que requiera acceso o modificación a los datos de la sesión. Esto se logra utilizando la función session_start(), la cual debe ser llamada al comienzo del script, antes de enviar cualquier salida al navegador.

La función session_start() verifica si ya existe una sesión activa para el usuario actual. Si existe, reanuda la sesión; si no, crea una nueva sesión y genera un identificador de sesión único. Este identificador, que suele almacenarse en una cookie en el navegador del usuario, permite al servidor mantener el seguimiento de la sesión en solicitudes posteriores.

Es crucial recordar que session_start() debe invocarse antes de enviar cualquier contenido, incluyendo espacios en blanco o caracteres de nueva línea. Si se envía salida al navegador antes de iniciar la sesión, se producirán errores relacionados con las cabeceras HTTP, ya que PHP no podrá modificar las cabeceras necesarias para gestionar la sesión.

Ejemplo de inicio de sesión en PHP:

<?php
session_start();
// Código adicional

En este ejemplo, se inicia la sesión con session_start() y luego se puede proceder con el resto del código que requiere acceso a la sesión.

Para finalizar una sesión y eliminar todos los datos asociados, se utiliza la función session_destroy(). Esta función destruye la información de la sesión almacenada en el servidor, pero no elimina las variables de sesión existentes en el script ni la cookie de sesión en el navegador del usuario.

Para garantizar la completa eliminación de la sesión, es recomendable seguir estos pasos adicionales:

  1. Vaciar el array $_SESSION para eliminar todas las variables de sesión.
  2. Eliminar la cookie de sesión en el navegador del usuario.
  3. Llamar a session_destroy() para destruir la sesión en el servidor.

Ejemplo de cierre de sesión seguro:

<?php
session_start();

// Vaciar el array $_SESSION
$_SESSION = [];

// Eliminar la cookie de sesión si existe
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(
        session_name(),
        '',
        time() - 42000,
        $params["path"],
        $params["domain"],
        $params["secure"],
        $params["httponly"]
    );
}

// Destruir la sesión
session_destroy();

En este código, se inicia la sesión con session_start(), luego se vacía $_SESSION, se elimina la cookie de sesión estableciendo su tiempo de expiración en el pasado y finalmente se llama a session_destroy().

La eliminación de la cookie es importante porque, de lo contrario, el identificador de sesión podría seguir siendo enviado al servidor en solicitudes posteriores, lo que podría representar un riesgo de seguridad. Al borrar la cookie, nos aseguramos de que el navegador del usuario no envíe más el identificador de sesión antiguo.

Es una buena práctica implementar este procedimiento de cierre de sesión en aplicaciones que manejan información sensible, ya que ayuda a prevenir el secuestro de sesión y otros ataques relacionados con la gestión inadecuada de sesiones.

Al trabajar con sesiones en PHP, es fundamental controlar adecuadamente su inicio y finalización. Siempre se debe llamar a session_start() al comienzo de los scripts que interactúan con la sesión y utilizar session_destroy() junto con la limpieza de variables y cookies cuando se requiera finalizar la sesión de manera segura.

Almacenamiento y recuperación de datos en $_SESSION

Una vez iniciada la sesión con session_start(), se puede utilizar la variable superglobal $_SESSION para almacenar y recuperar información que persiste durante la sesión del usuario. $_SESSION es un array asociativo que permite guardar datos accesibles en todas las páginas que compartan la misma sesión.

Almacenamiento de datos en $_SESSION

Para guardar información en la sesión, se asignan valores al array $_SESSION utilizando claves personalizadas. Por ejemplo:

<?php
session_start();

$_SESSION['usuario'] = 'María';
$_SESSION['email'] = 'maria@example.com';
$_SESSION['ultima_visita'] = time();

echo "Datos de sesión almacenados.\n";

En este ejemplo, se almacenan tres datos en la sesión: el nombre de la usuario, su email y la marca de tiempo de su última visita. Estos valores estarán disponibles en otras páginas que inicien la sesión con session_start().

Recuperación de datos de $_SESSION

Para acceder a los datos almacenados en la sesión, se utiliza el array $_SESSION con las claves correspondientes:

<?php
session_start();

if (isset($_SESSION['usuario'])) {
    echo "Bienvenida, " . $_SESSION['usuario'] . ".\n";
    echo "Tu email es: " . $_SESSION['email'] . ".\n";
    echo "Última visita: " . date('d/m/Y H:i:s', $_SESSION['ultima_visita']) . ".\n";
} else {
    echo "No hay datos de sesión disponibles.\n";
}

En este código, se verifica si existen datos en la sesión antes de acceder a ellos. Es fundamental utilizar isset() para comprobar la existencia de una clave en $_SESSION, evitando errores si la clave no está definida.

Actualización y eliminación de datos

Los valores en $_SESSION pueden ser actualizados asignando nuevos valores a las claves existentes. Para eliminar un dato de la sesión, se utiliza la función unset():

unset($_SESSION['email']);

Después de esto, la clave 'email' ya no estará disponible en la sesión.

Ejemplo práctico: contador de visitas

Un uso común de las sesiones es llevar un contador de visitas personalizado para cada usuario:

<?php
session_start();

if (isset($_SESSION['contador'])) {
    $_SESSION['contador']++;
} else {
    $_SESSION['contador'] = 1;
}

echo "Esta es tu visita número " . $_SESSION['contador'] . ".\n";

Aquí, se incrementa el valor de $_SESSION['contador'] cada vez que el usuario carga la página, manteniendo un seguimiento durante su sesión.

Almacenamiento de datos complejos

Es posible almacenar en $_SESSION cualquier tipo de dato que sea serializable, como arrays o incluso objetos. Por ejemplo, para guardar un carrito de compra:

<?php
session_start();

$_SESSION['carrito'][] = 'Producto A';
$_SESSION['carrito'][] = 'Producto B';

echo "Productos agregados al carrito.\n";

En este caso, se añade una lista de productos al array $_SESSION['carrito'].

Consideraciones de seguridad

Es importante ser consciente de la seguridad al utilizar sesiones. Nunca se deben almacenar en $_SESSION datos sensibles sin las medidas de protección adecuadas. Además, es recomendable limitar la cantidad de información almacenada para evitar afectar el rendimiento del servidor.

También es esencial validar y sanitizar cualquier dato que se extraiga de la sesión antes de utilizarlo, especialmente al mostrarlo en la interfaz del usuario, para prevenir vulnerabilidades como XSS.

Para seguir leyendo hazte Plus

¿Ya eres Plus? Accede a la app

20 % DE DESCUENTO

Plan mensual

19.00 /mes

15.20 € /mes

Precio normal mensual: 19 €
58 % DE DESCUENTO

Plan anual

10.00 /mes

8.00 € /mes

Ahorras 132 € al año
Precio normal anual: 120 €
Aprende PHP GRATIS online

Todas las lecciones de PHP

Accede a todas las lecciones de PHP y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Php

PHP

Introducción Y Entorno

Instalación Y Primer Programa De Php

PHP

Introducción Y Entorno

Tipos De Datos, Variables Y Constantes

PHP

Sintaxis

Operadores Y Expresiones

PHP

Sintaxis

Estructuras De Control

PHP

Sintaxis

Funciones Y Llamada De Funciones

PHP

Sintaxis

Cadenas De Texto Y Manipulación

PHP

Sintaxis

Manejo De Números

PHP

Sintaxis

Manejo De Fechas Y Tiempo

PHP

Sintaxis

Manejo De Arrays

PHP

Sintaxis

Introducción A La Poo En Php

PHP

Programación Orientada A Objetos

Clases Y Objetos

PHP

Programación Orientada A Objetos

Constructores Y Destructores

PHP

Programación Orientada A Objetos

Herencia

PHP

Programación Orientada A Objetos

Encapsulación

PHP

Programación Orientada A Objetos

Polimorfismo

PHP

Programación Orientada A Objetos

Interfaces

PHP

Programación Orientada A Objetos

Traits

PHP

Programación Orientada A Objetos

Namespaces

PHP

Programación Orientada A Objetos

Autoloading De Clases

PHP

Programación Orientada A Objetos

Manejo De Errores Y Excepciones

PHP

Programación Orientada A Objetos

Manejo De Archivos

PHP

Programación Orientada A Objetos

Patrones De Diseño

PHP

Programación Orientada A Objetos

Introducción A Los Formularios En Php

PHP

Formularios

Procesamiento De Datos De Formularios

PHP

Formularios

Manejo De Archivos En Formularios

PHP

Formularios

Redirecciones Y Retroalimentación Al Usuario

PHP

Formularios

Formularios Dinámicos Y Separación De Lógica

PHP

Formularios

Introducción A La Persistencia En Php

PHP

Persistencia

Conexión A Bases De Datos

PHP

Persistencia

Consultas Y Operaciones Crud

PHP

Persistencia

Gestión De Transacciones

PHP

Persistencia

Manejo De Errores Y Excepciones En Base De Datos

PHP

Persistencia

Patrones De Acceso A Datos

PHP

Persistencia

Concepto De Sesiones En Php

PHP

Sesiones Y Cookies

Configuración De Sesiones

PHP

Sesiones Y Cookies

Cookies

PHP

Sesiones Y Cookies

Manejo Avanzado De Sesiones Y Cookies

PHP

Sesiones Y Cookies

Principales Vulnerabilidades En Php

PHP

Seguridad

Seguridad En Formularios Y Entrada De Datos

PHP

Seguridad

Protección Frente A Inyección Sql

PHP

Seguridad

Gestión De Contraseñas Y Cifrado

PHP

Seguridad

Seguridad En Sesiones Y Cookies

PHP

Seguridad

Configuraciones De Php Para Seguridad

PHP

Seguridad

Introducción Al Testing En Php

PHP

Testing

Phpunit

PHP

Testing

Cobertura De Código En Testing

PHP

Testing

Test Doubles (Mocks, Stubs, Fakes, Spies)

PHP

Testing

Pruebas De Integración Y Funcionales

PHP

Testing

Accede GRATIS a PHP y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  1. Entender el problema del protocolo HTTP sin estado.
  2. Aprender a crear sesiones en PHP con session_start().
  3. Gestionar el almacenamiento de datos en $_SESSION.
  4. Destruir sesiones de forma segura usando session_destroy().
  5. Implementar ejemplos prácticos como un contador de visitas.
  6. Garantizar la seguridad al manipular datos de sesión.