Ves al contingut principal

Multiples sessions, mateix server

La funció session_name() a PHP s'utilitza per obtenir o establir el nom de la cookie de sessió. El nom per defecte és PHPSESSID. Canviar-lo pot tenir avantatges i inconvenients, i és útil en casos d'ús específics.

Avantatges i inconvenients

Avantatges

  • Seguretat: Canviar el nom per defecte de la cookie de sessió (PHPSESSID) pot ser una mesura de seguretat bàsica. Fa que sigui més difícil per a un atacant, que no conegui el nom de la cookie, realitzar atacs com ara el segrest de sessions (session hijacking). Això és una pràctica de "seguretat per foscor" (security through obscurity), que tot i no ser una solució definitiva, pot dificultar atacs genèrics.

  • Coexistència de sessions: Permet que coexisteixin múltiples aplicacions PHP al mateix domini sense conflictes. Si dues aplicacions tenen el mateix nom de cookie de sessió, les dades d'una podrien sobrescriure les de l'altra, causant errors. Utilitzar session_name() permet assignar un nom únic per a cada aplicació.

Inconvenients

  • Compatibilitat: Si es canvia el nom de la sessió, cal assegurar-se que totes les pàgines de l'aplicació utilitzen el mateix nom abans de cridar session_start(). Si no, es crearan múltiples sessions innecessàries, cadascuna amb un nom de cookie diferent.

  • Complexitat: Pot afegir una capa de complexitat a l'aplicació, ja que el nom de la sessió ha de ser gestionat i recordat per tot el codi.

Casos d'ús

  • Múltiples aplicacions en un mateix domini: Si tens més d'una aplicació web en el mateix domini (per exemple, un bloc i una botiga en línia), canviar el nom de la sessió evita que les dades de sessió d'un lloc interfereixin amb les de l'altre. Per exemple, el bloc podria utilitzar session_name('blog_sessid') i la botiga session_name('shop_sessid').

  • Millora de la seguretat: En entorns de producció, on la seguretat és prioritària, canviar el nom per defecte pot ser una petita barrera addicional contra atacs automatitzats. No obstant això, és important recordar que aquesta mesura ha de complementar, i no reemplaçar, altres mesures de seguretat més robustes, com la validació de dades i l'ús de tokens CSRF.

 

Blog + Shop = únic server

Codi blog

<?php
// fitxer: /blog/index.php

// Defineix un nom de sessió per al blog
session_name('blog_session');

// Inicia la sessió
session_start();

// Emmagatzema una variable de sessió per al blog
$_SESSION['usuari'] = 'Joan_blog';

echo "Sessió del blog iniciada com a: " . $_SESSION['usuari'] . ".<br>";
echo '<a href="/shop/index.php">Visitar la botiga</a>';

Codi botiga online

<?php
// fitxer: /shop/index.php

// Defineix un nom de sessió per a la botiga
session_name('shop_session');

// Inicia la sessió
session_start();

// Emmagatzema una variable de sessió per a la botiga
$_SESSION['carret'] = ['producte1', 'producte2'];

echo "Sessió de la botiga iniciada amb productes al carret.<br>";
echo "Contingut del carret: " . implode(', ', $_SESSION['carret']) . ".<br>";
echo '<a href="/blog/index.php">Tornar al blog</a>';

Si no s'hagués utilitzat session_name(), ambdós scripts crearien una cookie amb el nom per defecte PHPSESSID. Això podria provocar que la informació d'una aplicació (per exemple, l'usuari del blog) es perdés quan s'iniciés la sessió de l'altra, ja que la segona sessió sobreescriuria la primera. Utilitzar session_name() garanteix que cada aplicació mantingui les seves pròpies dades de sessió de manera independent.