Cookie

Cosa sono i cookie

I cookie sono porzioni di testo che lo user-agent memorizza localmente nel dispositivo.

Le loro specifiche sono definite nell’rfc sopra menzionata.

Prime note rilevanti

La loro dimensione può essere al massimo di 4KB.

Schema:

<cookie-name>=<cookie-value>; Expires=<date>; Max-Age=<non-zero-digit>; Domain=<domain-value>; Path=<path-value>; Secure; HttpOnly;

Se vengono impostati sia Expires che Max-Age, quest’ultimo prevale. Alcuni browser vecchi non supportano Max-Age.

Cookie creati server-side

Nel caso di applicazioni server-side (come con PHP) i cookie sono spediti negli header HTTP dal server allo user-agent.

  1. uno user-agent X fa una richiesta HTTP ad un server Y
  2. il server Y invia una risposta HTTP con uno o più Set-Cookie negli header allo user-agent X
  3. lo user agent X, se le sue impostazioni lo permettono, memorizza i cookie nei propri archivi locali
  4. ad OGNI nuova richiesta dello user-agent X al server Y i cookie vengono inviato e il server Y può leggerli (male per le performance)

Cookie creati client-side

Nel caso di applicazioni client-side (come con JavaScript) i cookie sono creati e gestiti accedendo alle API Document.cookie dello user-agent.

Ad OGNI nuova richiesta dello user-agent X al server Y i cookie vengono inviato e il server Y può leggerli (male per le performance).

JavaScript può accedere a cookie creati da header HTTP solo se non è stato impostato il flag HttpOnly (sicurezza).

Cookie di sessione

Se non viene indicata una data o una durata il cookie scade e viene cancellato alla chiusura del browser.

Okkio alla session restoring dei browser moderni.

Cookie persistenti

Se viene specificata una data (Expires) o una durata (Max-Age) il cookie viene mantenuto negli archivi del browser fino a tale scadenza.

La data fa riferimento al client, non al server.

Secure cookie

Con questa direttiva il cookie può essere trasmesso solo su protocollo HTTPS.

HttpOnly cookie

Con questa direttiva il cookie può essere gestito solo tramite protocollo HTTP e non può essere manipolato dalle API JavaScript Document.cookie , in determinate situazioni è una decisione presa in fase di progettazione per motivi di sicurezza.

Direttiva Domain

Con questa direttiva viene specificato se anche i sottodomini sono autorizzati a ricevere i cookie. Se non viene specificato sarà impostato in base all’attuale host del documento web e i sottodomini saranno esclusi. Se viene specificato ed è il dominio di secondo livello, i sottodomini saranno inclusi. Se viene specificato un solo sottodominio sarà autorizzato solo quello.

Direttiva Path

Con questa direttiva viene specificato il percorso autorizzato a ricevere i cookie.  Le sottocartelle del percorso saranno incluse. Il carattere %x2F (“/”) è un separatore di cartelle.

Cookie, JavaScript e Sicurezza

Session hijacking and XSS e Cross-site request forgery (CSRF).

Cookie e Privacy

Third-party cookies, Do-Not-Track, Zombie cookies e Evercookies

Do-Not-Track (DNT)

Si può inviare tramite HTTP header o leggere con JavaScript tramite la proprietà Navigator.doNotTrack .

0 : l’utente permette di essere tracciato
1 : l’utente non vuole essere tracciato

Varie Cookie

I cookie possono essere cancellati dall’utente o quando è esaurita la quota di spazio a loro riservata e in tal caso vengono cancellati i cookie più vecchi.

Se la creazione di un cookie è mal formulata il browser ignorerà gli attributi mal scritti, ma non l’intero cookie.

Codice JavaScript

function verificaCookieBrowser() {
  document.cookie = 'testAccettaCookie = verifica_cookie';
  var testcookie = (document.cookie.indexOf('verifica_cookie') != -1) ? true : false;
  return testcookie;
}

// if ( verificaCookieBrowser() ) alert('Il tuo browser accetta i cookie.');
// else alert('Il tuo browser NON accetta i cookie.');

function creaCookie(nome, valore, giorni, percorso, dominio) {

if (!nome) { alert ("nome cookie vuoto"); }

var cookieDaScrivere = nome + "=" + escape(valore) + ";"

if (giorni) {
   var oggi = new Date();
   /* 86400000 = 24h * 60m * 60s * 1000ms */
   oggi.setTime(oggi.getTime() + (giorni * 86400000)); 
   var durata = "; expires=" + oggi.toUTCString();
}
else { var durata = ""; }

cookieDaScrivere += "expires=" + durata + ";";

if (percorso) { cookieDaScrivere += "path=" + percorso + ";"; }
if (dominio) { cookieDaScrivere += "domain=" + dominio + ";"; }

document.cookie = cookieDaScrivere;

}


function leggiCookie(nome) {
   var nomeCookie = nome + "=";
   var cookieArray = document.cookie.split(';');

   for (var ix = 0; ix < cookieArray.length; ix++) {

     var c = cookieArray[ix];
     // pulizia spazi iniziali
     while (c.charAt(0) == ' ') { c = c.substring(1, c.length); }
     // confronto
     if (c.indexOf(nomeCookie) == 0) {
        return unescape( c.substring(nomeCookie.length, c.length) ); 
     }
   }

   return null;
}


function cancellaCookie(nome) {
   if ( leggiCookie( nome ) ) { creaCookie(nome, "", -1); }
}

Codice PHP

// imposta cookie
setcookie("phpcookie1", "uno");
//leggi cookie -------> al reload della pagina successiva <-------
if(isset($_COOKIE["phpcookie1"])) {
   print 'phpcookie1 : ' . $_COOKIE["phpcookie1"];
}
// aggiorna cookie
setcookie("phpcookie1", "uno-aggiornato");
// cancella cookie
setcookie("phpcookie1", "tre", time() - 3600);

setcookie deve essere eseguito prima del tag HTML

Corsi, letture per lo studio

https://www.quirksmode.org/js/cookies.html