Espera por favor...

Sesiones en PHP
Introducción

    Los métodos HTTP GET y POST sirven para enviar datos de una página web a otra. A pesar de que funcionan bien para hacer clic en enlaces y enviar formularios, son poco prácticos para compartir datos entre todas las páginas web de una aplicación. Para hacerlo, se necesita alguna otra forma de datos persistentes, en algún lugar donde se pueda almacenar temporalmente para que los programas PHP puedan acceder a los datos en cualquier momento desde cualquier página. Aquí es donde las sesiones ayudan.

    En este capítulo se explica cómo funcionan, por qué no se les debe tener miedo y cómo usarlos como otro integrante de las aplicaciones web dinámicas.

Sesiones en PHP
Almacenamiento persistente de datos

    Almacenamiento persistente de datos

    La mayoría de las aplicaciones web dinámicas requieren alguna forma de almacenar temporalmente los datos mientras los visitantes del sitio se abren camino a través de las páginas web de la aplicación. No se está hablando de almacenamiento a largo plazo de datos, se trata de almacenamiento a corto plazo de datos que una página web puede almacenar y otra recuperar, o como pasar información de un usuario autenticado a través del sitio web. Esto ayuda a la aplicación a rastrear a los visitantes del sitio y lo que están haciendo dentro de la aplicación.

    Aquí es donde las cookies HTTP entran en juego. Las cookies han sido mal recibidas en el mundo de la web, principalmente debido a un malentendido sobre cómo las empresas las usan. Una empresa no puede rastrear todo un historial de navegación mediante cookies, pero puede rastrear cuáles de sus avisos ha sido visitados. Esto ayuda a los gurús de marketing a orientar la publicidad en función de los enlaces de empresas que se han visitado previamente.

    Las cookies tienen un lugar válido en la línea de ensamblaje de herramientas dinámicas de aplicaciones web, desempeñando una función crucial para poder realizar un seguimiento de los visitantes individuales del sitio en una aplicación. Es crucial saber cómo funcionan y cómo usarlas. Esta sección describe los conceptos básicos de las cookies, por qué se necesitan y cómo usarlos de manera segura (y responsable) en las aplicaciones web dinámicas.

Sesiones en PHP
Propósito de las cookies HTTP

    Propósito de las cookies HTTP

    En el ámbito de los ordenadores mainframes, las personas que necesitan acceder a los programas que se ejecutan en el sistema primero deben iniciar sesión en el sistema. Por lo general, esto requiere ingresar algún tipo de información que lo identifique de manera única, como escribir una identificación de usuario, colocar el dedo en un escáner o insertar una tarjeta de identificación inteligente que incluya una clave única encriptada. Cuando el sistema autentica que eres quien dices ser, te permite acceder al sistema y a tus datos. Este proceso inicia lo que se llama una sesión.

    El mainframe rastrea cada transacción que realiza dentro de la sesión. Un administrador del sistema puede examinar el archivo de registro e identificar al usuario que realizó cada transacción en el sistema. Cuando se haya terminado de ingresar transacciones, debe cerrar sesión en el sistema para detener la sesión del usuario. Si se olvida cerrarla, otro usuario puede ingresar y realizar nuevas transacciones que el mainframe acredite a su sesión. En estos sistemas, realizar un seguimiento de las sesiones es sencillo, ya que cada usuario inicia sesión desde un dispositivo específico (ya sea un terminal directamente conectado o una conexión de red persistente), realiza transacciones y luego cierra la sesión.

    Desafortunadamente, no es tan fácil en las aplicaciones web dinámicas. El estándar HTTP estaba destinado a recuperar datos de un servidor remoto de forma anónima y sin estado. Esto significa no tener que lidiar con las formalidades de una sesión. En esencia, una sesión web consiste en una sola transacción, y ni siquiera requiere una identificación para identificar al usuario.

    Las aplicaciones web dinámicas son algo así como un híbrido de estos dos entornos. Desean mantener la facilidad de una sesión anónima HTTP, pero necesitan rastrear a los usuarios y sus transacciones como una sesión de mainframe. Aquí es donde las cookies llegan para el problema. Las cookies son datos que un servidor puede almacenar temporalmente en el navegador de cada visitante del sitio. Cuando el navegador almacena los datos de la cookie, el servidor puede recuperar esa información en transacciones posteriores con el visitante del sitio. Esto permite que el servidor (y, por lo tanto, la aplicación del lado del servidor) identifique el sitio individual visitante y realice un seguimiento de lo que están haciendo dentro de la aplicación. Este es el comienzo de una verdadera sesión web.

Sesiones en PHP
Tipos de cookies

    Tipos de cookies

    Hay varias características diferentes de las cookies HTTP, cada una de las cuales define una forma diferente de usarla. La tabla enumera los diferentes tipos que se pueden emplear.

    Tipo Descripción
    HttpOnly Solo se puede acceder a través de HTTP, no a través de JavaScript
    Persistent Expira en una fecha/hora específica o después de un período específico de tiempo
    SameSite Solo se puede enviar en solicitudes del mismo origen que el dominio de destino
    Session La sesión expira cuando se cierra la ventana del navegador del cliente
    Secure Solo se puede enviar en conexiones HTTPS
    Supercookie Usa un dominio de nivel superior como origen, lo que permite el acceso a múltiples sitios web
    Third-party Utiliza un dominio que no coincide con el dominio de URL para la página web
    El tipo estándar de cookie es la más persistente, estas son enviadas por el servidor web para ser almacenadas en el navegador del cliente por un período específico de tiempo. La aplicación puede almacenar datos en una cookie persistente y luego acceder a esos datos en cualquier momento en el futuro hasta que caduque. A diferencia de las cookies persistentes, las de sesión solo duran mientras la ventana del navegador del cliente permanezca abierta. Cuando el visitante del sitio cierra la ventana del navegador, las de sesión (y los datos que contienen) desaparecen.

    Las cookies de terceros son las que dieron un mal nombre a las cookies. Con las persistentes y de sesión, un servidor web solo puede recuperar y leer las cookies que establece; no tiene acceso a las situadas por otros servidores. Esto ayuda a proteger la privacidad de los visitantes del sitio impidiendo que un servidor único determine todos los sitios web que visitó un visitante del sitio.

    Las cookies de terceros utilizan una laguna para evitar eso. En la actualidad, es muy común que una página web contenga anuncios integrados de otros sitios web. Esos anuncios incrustados ejecutan código creado por el sitio web remoto y pueden establecer cookies desde el sitio web remoto, almacenando la ubicación del sitio web principal del anuncio insertado. Esto permite a una empresa comprar espacio publicitario en múltiples sitios web comunes y luego determinar qué visitantes del sitio han visitado qué sitio web mediante el seguimiento de las cookies que establece en los anuncios.

Sesiones en PHP
Anatomía de cookies

    Anatomía de cookies

    El estándar HTTP define cómo los servidores web establecen y recuperan las cookies dentro de la sesión HTTP con un navegador de cliente. Cuando un navegador cliente solicita ver una página web en un servidor, envía una solicitud HTTP GET:

    GET /index.php
    Host: www.miservidor.es


    La solicitud especifica la página web que se va a recuperar y el host desde donde recuperarla (generalmente el mismo servidor al que se envía la solicitud). El servidor host devuelve una respuesta HTTP, que incluye el código de estado para la solicitud, junto con cualquier cookie que quiera establecer utilizando la declaración Set-Cookie, y luego el código HTML para la página web solicitada:

    HTTP/1.0 GET OK
    Content-type: text/html
    Set-Cookie: name1=valor1; atributos
    Set-Cookie: name2=valor2; atributos
    HTML contenido de la página


    La información de la cookie aparece antes del HTML de la página web solicitada. El servidor asigna a cada cookie un nombre único y un valor, y posiblemente agrega atributos opcionales que definen su tipo. El navegador del cliente revisa la cookie como un archivo temporal separado del dispositivo del cliente.

    La declaración Set-Cookie puede listar uno o más atributos opcionales para la cookie. La siguiente tabla enumera los atributos de cookies que se pueden establecer.

    Atributo Descripción
    Domain=sitio Especifica el dominio al que se aplica la cookie. Si se omite, el servidor es la ubicación predeterminada.
    Expires = datetime Especifica la fecha de caducidad de la cookie como un valor de marca de tiempo HTTP.
    HttpOnly Especifica que la cookie solo se puede recuperar en una sesión HTTP.
    Max-Age=número Especifica el tiempo de caducidad de la cookie en segundos.
    Path=ruta Indica la ruta en la URL que debe existir en el recurso solicitado.
    SameSite = configuración Especifica si solo se puede acceder a la cookie desde el mismo sitio que la configuró. Los valores son Stricte o Lax.
    Secure Especifica que la cookie solo se puede enviar en una sesión segura de HTTPS.

    Si se establecen los atributos Expires o Max-Age, la cookie es persistente, y estará disponible hasta la fecha y/u hora de vencimiento. Si no se especifican atributos, es una cookie de sesión y se eliminará cuando se cierre la ventana del navegador del cliente. El atributo Expires especifica una fecha y hora exactas en que caducará:

    Set-Cookie: id=25; Expires=Mon 12 May 2025 14:30:00 GMT;

    El atributo Max-Age establece una duración de tiempo (en segundos) que la cookie debe permanecer válida:

    Set-Cookie: id=25; Max-Age=3600

    Después de que el servidor establece una cookie, la próxima vez que el navegador del cliente solicite una página web desde el mismo destino, envía todas las cookies establecidas desde ese destino en la solicitud HTTP utilizando una única declaración de cookie:

    GET /index.php
    Host: www.miservidor.es
    Cookie: name1=valor1; name2=valor2


    La declaración de Cookie simplemente envía el par nombre/valor para todas las cookies establecidas por ese servidor. No envía ningún atributo que el servidor haya establecido para las cookies. El servidor puede extraer los nombres y valores de cookies por separado y pasarlos a cualquier lenguaje de programación del lado del servidor (como los programas de PHP).

Sesiones en PHP
Reglas de cookies

    Reglas de cookies

    En general, la implementación de cookies en los navegadores es algo no estándar.

    No hay dos navegadores cliente que las manejen de la misma manera. Sin embargo, existen unos requisitos mínimos que el estándar HTTP especifica:
      - El navegador debe admitir cookies de hasta 4096 bytes de tamaño.
      - El navegador debe admitir al menos 50 cookies por sitio web.
      - El navegador debe poder almacenar al menos 3000 cookies en total.

    La mayoría de los navegadores superan estos requisitos, pero es mejor no probar los límites en aplicaciones propias. Si se necesita almacenar grandes cantidades de datos para una aplicación, es mejor utilizar algún otro tipo de almacenamiento de datos persistente, como una base de datos. Se puede almacenar una clave que identifique al visitante del sitio como una cookie, y luego usar esa clave para hacer referencia a las cantidades más grandes de datos almacenados en la base de datos asociada con ese visitante del sitio.

    Se ha de tener cuidado cuando se utilizan cookies de sesión. Todavía hay controversia en el ámbito del navegador sobre cómo manejar las cookies de sesión, especialmente ahora que los navegadores con pestañas son los más usados. La mayoría los navegadores consideran todas las pestañas de la página web dentro del mismo navegador como una sola sesión. Para cerrar la sesión, el visitante del sitio debe cerrar toda la ventana del navegador, no solo la pestaña de la página web. También, muchos navegadores ahora tienen una característica que permite la opción de guardar almacenando los datos de las cookies de sesión en lugar de eliminarlos cuando el archivo se cierra la ventana del navegador. Esto elude de alguna manera toda la idea de cookies de sesión.

Sesiones en PHP
Establecimiento de cookies

    PHP permite interactuar completamente con las cookies en las aplicaciones web. Se pueden establecer desde una página web, recuperarlas y leerlas en otra web y eliminarlas de otra página web. Esta sección indica el código que se necesita utilizar para implementar cookies en aplicaciones PHP.

    Configuración de cookies

    PHP usa la directiva setcookie() para establecer nuevas cookies y actualizar las existentes. Este es el formato básico de la función setcookie():

    setcookie(nombre [, valor] [, expira] [, ruta] [, dominio] [, segura] [, solohttp])

    El único parámetro requerido es el nombre de la cookie, aunque casi siempre se incluye un valor. Si se omite el valor, se fija como NULL.

    La opción expira permite especificar la fecha de caducidad y tiempo como un valor Unix, convirtiéndola en persistente. El Unix el formato de marca de tiempo es un valor entero del número de segundos transcurridos desde medianoche del uno de enero de 1970.

    Los últimos cuatro parámetros permiten especificar URL y dominios permitidos para acceder a la cookie, y si debe establecerse como segura o solo http.

    Se ha de tener cuidado con el parámetro expira. Aunque el mensaje HTTP envía el atributo de caducidad como fecha y hora completas, con la función setcookie() lo configura usando un valor de marca de tiempo, no una fecha y hora estándar. La forma en que la mayoría de los desarrolladores de PHP hacen eso agregando el número de segundos a la fecha y hora actuales recuperadas de la función time():

    setcookie ("prueba", "Verificando", time() + (60*60*24*10));

    Esto establece que la cookie llamada prueba caduque diez días desde el momento en que el visitante del sitio accede a la página web.

Sesiones en PHP
Establecimiento de cookies

    Pasos para probar la configuración de una cookie persistente desde una aplicación PHP:

    1- Abrir el editor de textos, editor de programa o paquete de entorno de desarrollo integrado (IDE).

    2- Escribir el siguiente código en el editor:

    <?php
    setcookie("prueba1", "Esto es una prueba de cookie", time() + 600);
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Prueba PHP Cookie</title>
    </head>
    <body>
    <h1>Estableciendo el cookie</h1>
    </body>
    </html>


    3- Guardar el archivo como cookiprueba1.php en la carpeta raíz del servidor web.

    4- Iniciar el Panel de control de XAMPP y a continuación iniciar el servidor web Apache.

    5- Abrir el navegador e ingresar el siguiente URL:

    http://localhost:8080/cookiprueba1.php (O probar en esta dirección

    Es posible que se necesite cambiar el número de puerto TCP para que coincida con el servidor web.

    6- Con las herramientas para desarrolladores del navegador, verificar las cookies establecidas desde la página web y su fecha y hora de vencimiento. Se debería ver prueba1. Se debe configurar para que expire en diez minutos.

    7- Cerrar la ventana del navegador cuando se haya terminado.

Sesiones en PHP
Establecimiento de cookies

    El servidor PHP ubica automáticamente todas las cookies pasadas desde el cliente en la variable especial de matriz $_COOKIE[ ].

    El nombre de cookie que se asignó en la declaración setcookie() se convierte en la clave de matriz asociativa:

    $_COOKIE['nombre']

    Si una cookie ha caducado, se obtendrá un mensaje de error al intentar acceder a ella utilizando la variable tipo array $_COOKIE[ ]. Es una buena idea comprobar siempre primero que existe, usando la función isset()

    if (isset($_COOKIE['prueba'])) {
    $dato = $_COOKIE['prueba'];
    } else {
    $dato = 0;
    }


    Este código establecerá el valor de la variable $dato usada en el programa a 0 si la cookie no existe. A continuación, se puede comprobar la condición 0 en la variable para determinar si falta.

    Código de ejemplo:

    <!DOCTYPE html>
    <html>
    <head>
    <title>PHP Cookie de prueba</title>
    </head>
    <body>
    <h1>Recuperación del cookie</h1>
    <?php
    if (isset($_COOKIE['prueba1'])) {
    $dato = $_COOKIE['prueba1'];
    echo "<p>El cookie se estableció: $dato</p> \n";
    } else {
    echo "<p>No se ecuentra cookie</p> \n";
    }
    ?>
    </body>
    </html>

Sesiones en PHP
Modificación y eliminación de cookies

    Se puede modificar fácilmente una cookie existente simplemente reenviandola con el valor actualizado:

    setcookie("prueba1", "Dato nuevo", time() + 600);

    Al reenviarla, el navegador sobrescribe la información original con la nueva, incluyendo la hora de vencimiento actualizada. Si se especifica una hora relativa a la hora actual, se modificará el tiempo de caducidad.

    Para eliminar una cookie, solo hay que establecer el tiempo de caducidad en un valor de tiempo pasado:

    setcookie("prueba1", "", time() - 1);

    Si se ajusta el tiempo de caducidad un segundo antes que la hora actual, el navegador inmediatamente la expirará.

    Código de ejemplo:

    <?php
    if (!isset($_COOKIE['prueba1'])) {
    setcookie("prueba1", "Ejemplo de prueba", time() + 600);
    } else {
    setcookie("prueba1", "", time() - 1);
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Eliminado una Cookie</title>
    </head>
    <body>
    <h1>Cookie estatus:</h1>
    <?php
    if (isset($_COOKIE['prueba1'])) {
    $data = $_COOKIE['prueba1'];
    echo "<p>Cookie establecida: $data<p>\n";
    } else {
    echo "<p>Cookie no establecida</p>\n";
    }
    ?>
    <a href="cookieprueba3.php">Pulsa para probar de nuevo</a>
    </body>
    </html>

Sesiones en PHP
PHP y sesiones

    PHP maneja las sesiones y las cookies de sesión de una manera un poco diferente a las cookies persistentes.

    En lugar de almacenar las cookies de sesión en el navegador del cliente como separadas, PHP asigna un identificador de sesión único a cada sesión de visitante del sitio y lo almacena como una cookie de sesión en el navegador del cliente. PHP luego almacena cualquier dato asociado con la sesión en un archivo temporal ubicado en el servidor PHP. Esto ayuda a proteger los datos de la sesión, ya que no son almacenados en el navegador del cliente en cualquier momento. Cuando termina la sesión, PHP elimina automáticamente el archivo de sesión temporal en el servidor.

    Esta característica por sí sola hace que el uso de sesiones para almacenar datos sea más atractivo que utilizando cookies persistentes. Los únicos datos enviados entre el navegador del cliente y el servidor es el valor del ID de sesión asignado a la sesión. Todos los datos se quedan en el servidor local.

Sesiones en PHP
Iniciar una sesión

    Antes de poder fijar o leer cualquier dato de la sesión, se debe iniciar la sesión.

    PHP proporciona una manera fácil de declarar sesiones en las páginas web. la función session_start() envía automáticamente el código HTTP requerido a el navegador del cliente remoto para crear una cookie de sesión.

    PHP asigna al cookie de sesión un valor de ID único para identificar la sesión. En el archivo PHP (el código para la página web), la función session_start() debe ir antes que cualquier código HTML, incluyendo la etiqueta El código PHP de la sesión se ve así:

    <?php
    session_start();
    ?>
    <!DOCTYPE html>
    <html>


    Se debe añadir la función session_start() al inicio de cada página web que necesite acceder a los datos de la sesión. Si la función session_start() no está presente, PHP no busca el ID de la sesión, y la aplicación no puede.

Sesiones en PHP
Almacenamiento y recuperación de datos de sesión

    Almacenamiento y recuperación de datos de sesión
    Después de inicializar la sesión utilizando la función session_start() se puede utilizar $_SESSION[] para establecer y recuperar los datos de la sesión en la solicitud.

    Para fijar un nuevo valor, se define en una declaración de asignación:

    SESIÓN['item'] = "ordenador";

    Se utiliza el nombre de la cookie de sesión como clave de una matriz asociativa. Cuando se fija un nombre de cookie de sesión / par de valor, se puede acceder en cualquier momento en cualquier página web que sea parte de la misma sesión:

    echo "Has comprado un " . $_SESSION['item'];

    Código de ejemplo (archivo sesiondeprueba1.php):

    <?php
    session_start();
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Probando cookies de sesión</title>
    </head>
    <body>
    <h1>Estableciendo cookie</h1>
    <?php
    $_SESSION['test2'] = "Segundo cookie de prueba";
    ?>
    <a href="sessiondeprueba2.php">Pulsa para continuar</a>
    </body>
    </html>


    Código de ejemplo (archivo sesiondeprueba2.php):

    <?php
    session_start();
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Probando cookies de sesión</title>
    </head>
    <body>
    <h1>Recuperando cookie de sesión</h1>
    <?php
    if (isset($_SESSION['test2'])) {
    $data = $_SESSION['test2'];
    echo "<p>Cookie de sesión: $data</p>\n";
    } else {
    echo "<p>Error al acceder a cookie de sesión</p>\n";
    }
    ?>
    <a href="sessiontest1.php">Vuelta al inicio</a>
    </body>
    </html>


    Acceso al ejemplo:

    sesiondeprueba1.php
    sesiondeprueba2.php

Sesiones en PHP
Eliminación de datos de sesión

    Eliminación de datos de sesión

    Hay tres maneras de eliminar los datos de las cookies de sesión:
      - Eliminar valores de sesión individuales.
      - Eliminar todos los valores de la sesión, pero manteniéndola activa.
      - Eliminar la cookie de sesión de ID de sesión original, cuando se elimina la sesión.


    Para eliminar valores de sesión individuales, se utilizan las funciones unset() junto con la variable de sesión array a eliminar:

    unset($_SESSION['item']);

    Esto elimina el par nombre/valor de sesión de los datos de sesión en el archivo temporal del servidor, pero mantiene el archivo temporal y la cookie de sesión de ID de sesión en el navegador del cliente.

    Para eliminar todos los pares de nombre / valor de sesión de los datos de sesión, pero mantener la cookie de sesión de ID de sesión, se usa la función session_unset ()

    session_unset ();

    Puede terminar una sesión completa utilizando la función session_destroy () en cualquier lugar de la aplicación PHP:

    session_destroy ();

    Esto elimina todos los pares de nombre / valor de sesión asociados con la sesión, así como el valor de ID de sesión asignado a la cookie de sesión del navegador del cliente. Si el visitante del sitio continúa en otra página web de la aplicación, la función session_start () establecerá una nueva cookie de sesión de ID de sesión, junto con un nuevo archivo de sesión temporal en el servidor asociado a la sesión.

Búsquedas en UMU