Volver a la página principal
miércoles 25 septiembre 2024
19

Cómo compartir cookies entre subdominios en PHP

Compartir cookies entre subdominios es una técnica esencial cuando gestionas múltiples subdominios bajo un dominio principal y necesitas mantener una sesión de usuario o compartir cierta información entre ellos. En PHP, esta tarea es relativamente sencilla utilizando algunas configuraciones específicas para las cookies.

Antes de adentrarnos en los detalles técnicos de cómo compartir cookies, es importante recordar qué es una cookie. Una cookie es un pequeño archivo que los servidores web envían a los navegadores para almacenar información. Esta información puede ser leída en futuras solicitudes y es ampliamente usada para gestionar sesiones de usuario, preferencias, seguimiento de actividades, entre otras funciones.

Componentes de una cookie

Las cookies contienen varios parámetros importantes, entre ellos:

1. Nombre: El nombre de la cookie.

2. Valor: El valor almacenado en la cookie.

3. Fecha de expiración: Cuándo expira la cookie.

4. Ruta: El camino donde la cookie está disponible.

5. Dominio: El dominio o subdominios donde la cookie es válida.

6. Seguro: Indica si la cookie debe transmitirse solo a través de HTTPS.

7. HttpOnly: Indica si la cookie es accesible solo desde el servidor (no desde scripts como JavaScript).

El problema con los subdominios

Por defecto, las cookies están restringidas al dominio donde fueron creadas, lo que significa que una cookie establecida en example.com no será accesible automáticamente en sub.example.com, a menos que especifiques lo contrario.

Cuando trabajas con varios subdominios (por ejemplo, sub1.example.com y sub2.example.com), es posible que quieras compartir las cookies entre ellos para gestionar sesiones de usuario o compartir cierta información. Para lograr esto, es necesario establecer correctamente el parámetro Domain de la cookie.

Estableciendo cookies compartidas entre subdominios en PHP

La función principal que usaremos para establecer cookies en PHP es setcookie(). Esta función permite definir las cookies y sus parámetros.

Sintaxis básica de setcookie()

bool setcookie ( string $nombre , string $valor = "" , int $expiracion = 0 , string $ruta = "" , string $dominio = "" , bool $seguro = false , bool $httponly = false )
  • $nombre: El nombre de la cookie.
  • $valor: El valor de la cookie.
  • $expiracion: Fecha de expiración de la cookie en formato timestamp Unix. Si se establece a 0, la cookie expirará cuando el navegador se cierre.
  • $ruta: La ruta donde la cookie estará disponible.
  • $dominio: El dominio donde la cookie será accesible. Este es el parámetro clave para compartir cookies entre subdominios.
  • $seguro: Si se establece en true, la cookie solo se transmitirá a través de HTTPS.
  • $httponly: Si se establece en true, la cookie solo será accesible desde HTTP (y no desde JavaScript).

Ejemplo práctico para compartir cookies entre subdominios

Para compartir una cookie entre los subdominios de example.com, debes configurar el parámetro $dominio de la siguiente manera:

<?php
// Establecer una cookie válida para todos los subdominios de example.com
$nombre = "usuario";
$valor = "Juan Perez";
$expiracion = time() + 86400; // 1 día
$ruta = "/";
$dominio = ".example.com"; // El punto inicial asegura que se aplique a todos los subdominios

// Configurar la cookie
setcookie($nombre, $valor, $expiracion, $ruta, $dominio, true, true);
?>

En este ejemplo:

  • La cookie llamada usuario contiene el valor "Juan Perez".
  • La cookie expirará en un día.
  • La cookie estará disponible en todas las rutas (/).
  • La clave está en el parámetro $dominio = ".example.com", lo que hace que la cookie esté disponible tanto en el dominio principal (example.com) como en sus subdominios (sub1.example.com, sub2.example.com, etc.).
  • El parámetro seguro está en true, lo que significa que esta cookie solo se enviará a través de conexiones HTTPS.
  • HttpOnly está configurado en true para que la cookie no sea accesible desde scripts JavaScript.

¿Por qué es importante el punto inicial en el dominio?

El punto al inicio del dominio (.example.com) es esencial para que la cookie sea compartida entre todos los subdominios. Si omites el punto inicial y configuras el dominio simplemente como example.com, la cookie solo será accesible en el dominio principal, pero no en sus subdominios.

Consideraciones de seguridad

Cuando trabajas con cookies, especialmente al compartirlas entre subdominios, es importante tener en cuenta algunos aspectos de seguridad:

1. Usar HTTPS siempre que sea posible: Asegúrate de que las cookies se envíen solo a través de conexiones seguras utilizando el parámetro secure en true. Esto evita que la información se transmita de manera insegura.

2. HttpOnly para evitar ataques XSS: Al establecer la opción HttpOnly a true, se garantiza que las cookies no sean accesibles desde JavaScript, lo que reduce el riesgo de ataques de tipo Cross-Site Scripting (XSS).

3. SameSite Attribute: Aunque no está disponible en la función setcookie() de PHP por defecto (hasta versiones recientes), es recomendable añadir el atributo SameSite para controlar si las cookies deben ser enviadas con solicitudes entre sitios (cross-site) o solo con solicitudes dentro del mismo sitio. Este atributo puede ayudar a prevenir ataques de tipo Cross-Site Request Forgery (CSRF). A partir de PHP 7.3, puedes configurar SameSite utilizando la función setcookie() o las cabeceras HTTP:

setcookie("usuario", "Juan Perez", [
        'expires' => time() + 86400,
        'path' => '/',
        'domain' => '.example.com',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'Strict', // Puede ser 'Strict', 'Lax', o 'None'
    ]);

El valor Strict asegura que la cookie no se envíe en solicitudes de terceros, mientras que Lax permite cierta flexibilidad, como solicitudes GET.

Conclusión

Compartir cookies entre subdominios en PHP es una técnica útil cuando necesitas mantener sesiones o compartir información entre diferentes subdominios de un mismo sitio web. A través de la función setcookie() y configurando correctamente el dominio, puedes lograr que las cookies sean accesibles en todos los subdominios de tu aplicación.

Recuerda siempre considerar los aspectos de seguridad, como el uso de HTTPS, el atributo HttpOnly y SameSite, para garantizar que las cookies no se utilicen de manera indebida o comprometan la seguridad de tu aplicación.

Con estas técnicas, tendrás un mejor control sobre la gestión de sesiones y otras funcionalidades que requieran el uso compartido de cookies entre subdominios.

Etiquetas:
php
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer