Apuntes php

PHP: Porque a veces necesitas un poco de caos en tu vida.

Manejo de Sesiones

Las sesiones permiten mantener datos del usuario entre diferentes páginas, como el contenido de un carrito de compras o el estado de inicio de sesión. En esta lección aprenderás a usar $_SESSION, configurarlas de forma segura y gestionar su ciclo de vida.

Introducción

Una sesión es un mecanismo para almacenar datos en el servidor, asociados a un ID único que se envía al cliente (normalmente vía cookie). PHP usa la superglobal $_SESSION para gestionar estos datos.

Ejemplo básico:

<?php
declare(strict_types=1);

session_start();
$_SESSION["usuario"] = "Ana";
echo "Sesión iniciada para: " . $_SESSION["usuario"] . "\n";
?>

Iniciar y Usar Sesiones

Para usar sesiones, siempre llama a session_start() al inicio de tu script. Esto crea o reanuda una sesión.

<?php
declare(strict_types=1);

session_start();

// Almacenar datos
$_SESSION["nombre"] = "Jorge";
$_SESSION["visitas"] = ($_SESSION["visitas"] ?? 0) + 1;

// Mostrar datos
echo "Hola, " . $_SESSION["nombre"] . "\n";
echo "Has visitado esta página " . $_SESSION["visitas"] . " veces\n";
?>

Notas: - session_start() debe ejecutarse antes de cualquier salida (HTML, echo, etc.). - Usa (string) o (int) para forzar tipos en $_SESSION:

<?php
$_SESSION["edad"] = (int)($_SESSION["edad"] ?? 0);
?>

Seguridad en Sesiones

  • Regenerar ID: Evita ataques de fijación de sesión con session_regenerate_id():
<?php
declare(strict_types=1);

session_start();
$_SESSION["autenticado"] = true;
session_regenerate_id(true); // Elimina el ID anterior
?>
  • Sanitización: Valida datos antes de guardarlos:
<?php
$nombre = filter_input(INPUT_POST, "nombre", FILTER_SANITIZE_STRING) ?? "";
if ($nombre !== "") {
    $_SESSION["nombre"] = $nombre;
}
?>
  • XSS: Usa htmlspecialchars() al mostrar datos:
<?php
echo htmlspecialchars($_SESSION["nombre"] ?? "", ENT_QUOTES, "UTF-8");
?>

Nota: FILTER_SANITIZE_STRING está obsoleto desde PHP 8.1 y eliminado en PHP 8.3. Mejor usar FILTER_UNSAFE_RAW junto con htmlspecialchars().

Cerrar Sesiones

Para cerrar una sesión:

<?php
        session_start();
$_SESSION = [];          // Vaciar datos
session_destroy();       // Destruir sesión
session_unset();         // Opcional: libera variables de sesión

echo "Sesión cerrada\n";
?>

Notas

:
  • Usa unset($_SESSION["clave"]) para eliminar una clave específica.
  • Puedes almacenar cualquier tipo de dato serializable (strings, arrays, objetos...), pero evita guardar grandes cantidades de datos en $_SESSION.
  • session_destroy() elimina los datos de la sesión en el servidor, pero la cookie en el navegador puede seguir existiendo hasta que expire o se elimine manualmente.

Configuración de Sesiones

Ajusta la configuración en php.ini o con ini_set(). Por ejemplo, ini_set("session.cookie_secure", "1"); (Solo si usas HTTPS)

<?php
declare(strict_types=1);

ini_set("session.cookie_lifetime", (string)(60 * 60)); // 1 hora
session_start();
?>

Opciones comunes: - session.cookie_lifetime: Tiempo de vida de la cookie. - session.use_strict_mode: Evita sesiones no inicializadas. - session.cookie_httponly: Protege contra XSS. session.cookie_secure: Solo envía cookies por HTTPS.

ini_set("session.cookie_secure", "1"); // Solo si usas HTTPS

Ejemplo Práctico: Contador de Visitas

Para contar visitas, podemos usar una variable de sesión que se incrementa en cada carga de la página:

<?php
session_start();
$_SESSION["contador"] = ($_SESSION["contador"] ?? 0) + 1;
echo "Visitas: " . $_SESSION["contador"] . "\n";
?>

¿Qué hace esa línea?

  • El operador ?? comprueba si $_SESSION["contador"] existe y no es null.
  • Si no existe, se usa 0 como valor inicial.
  • Luego se le suma 1 y se asigna el resultado de nuevo a $_SESSION["contador"].

Esta forma es compacta y segura. Equivale a:

<?php
if (!isset($_SESSION["contador"])) {
    $_SESSION["contador"] = 0;
}
$_SESSION["contador"] += 1;
?>
TOP