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.
- uno user-agent X fa una richiesta HTTP ad un server Y
- il server Y invia una risposta HTTP con uno o più Set-Cookie negli header allo user-agent X
- lo user agent X, se le sue impostazioni lo permettono, memorizza i cookie nei propri archivi locali
- 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
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
Riferimenti
DNT: https://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#dnt-header-field