Problema: Restrizioni sui caratteri dei cookie
Quando si creano cookie per applicazioni web, è necessario conoscere i limiti dei caratteri. Non tutti i caratteri possono essere utilizzati nei nomi e nei valori dei cookie. Questo può causare problemi se usati in modo errato. Conoscere questi limiti è fondamentale per il corretto funzionamento dei cookie e per evitare rischi di sicurezza.
Implementazione delle restrizioni sui caratteri dei cookie nei browser
Pratiche comuni dei browser
I browser web gestiscono le restrizioni sui caratteri dei cookie in modo simile per seguire gli standard web. Ecco alcune pratiche comuni:
Codifica URL dei caratteri speciali
I browser applicano la codifica URL ai caratteri speciali nei valori dei cookie. Questo converte i caratteri non consentiti negli URL in un formato sicuro.
| Carattere | Codifica URL |
|---|---|
| Spazio | %20 |
| = | %3D |
| & | %26 |
| + | %2B |
| / | %2F |
Esempio: Impostazione di un cookie con caratteri speciali
document.cookie = "user_info=John Doe & Co.; path=/";
// Il browser lo memorizza come: user_info=John%20Doe%20%26%20Co.
Gestione dei caratteri non ASCII
La maggior parte dei browser supporta la codifica UTF-8 per i caratteri non ASCII nei valori dei cookie. È meglio codificare manualmente questi caratteri:
Esempio: Codifica dei caratteri non ASCII
const userName = "José";
document.cookie = `user=${encodeURIComponent(userName)}; path=/`;
// Il browser lo memorizza come: user=Jos%C3%A9
Limitazioni specifiche dei browser
I browser generalmente seguono pratiche simili, ma possono esserci differenze nel modo in cui gestiscono i cookie.
Suggerimento: Limitazioni dei cookie nei browser
- Chrome: Fino a 180 cookie per dominio, 4096 byte per cookie
- Firefox: Fino a 150 cookie per dominio, 4097 byte per cookie
- Safari: Fino a 600 cookie in totale, 4093 byte per cookie
- Internet Explorer: Fino a 50 cookie per dominio, 4096 byte per cookie
Strategie per lavorare con le limitazioni dei browser
- Dividere i dati di grandi dimensioni in più cookie
Esempio: Divisione di dati di grandi dimensioni in più cookie
function setLargeCookie(name, value) {
const maxLength = 4000;
const parts = Math.ceil(value.length / maxLength);
for (let i = 0; i < parts; i++) {
const part = value.substr(i * maxLength, maxLength);
document.cookie = `${name}_${i}=${part}; path=/`;
}
}
// Utilizzo
setLargeCookie("user_data", "stringa_molto_lunga_di_dati_utente");
- Utilizzare il local storage per i dati lato client che non devono essere inviati con ogni richiesta
Esempio: Utilizzo del local storage per dati di grandi dimensioni
// Memorizzazione di dati di grandi dimensioni nel local storage
localStorage.setItem('user_preferences', JSON.stringify(oggettoPreferenzeUtenteGrandi));
// Recupero dei dati dal local storage
const userPreferences = JSON.parse(localStorage.getItem('user_preferences'));
- Implementare un meccanismo di fallback per i browser con limiti più rigidi
Esempio: Meccanismo di fallback per l'archiviazione dei cookie
function setCookie(name, value, days) {
try {
document.cookie = `${name}=${value}; max-age=${days * 24 * 60 * 60}; path=/`;
} catch (error) {
console.warn(`Impossibile impostare il cookie: ${error.message}`);
localStorage.setItem(name, value);
}
}
function getCookie(name) {
const value = document.cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)');
return value ? value.pop() : localStorage.getItem(name);
}
Gestione dei caratteri internazionali
Quando si tratta di caratteri internazionali nei cookie, considera questi approcci:
- Usa
encodeURIComponent()per la codifica edecodeURIComponent()per la decodifica - Per scenari più complessi, usa
btoa()eatob()per la codifica Base64
Esempio: Gestione dei caratteri internazionali nei cookie
// Codifica dei caratteri internazionali
const internationalName = "안녕하세요";
document.cookie = `greeting=${encodeURIComponent(internationalName)}; path=/`;
// Decodifica
const storedGreeting = decodeURIComponent(getCookie('greeting'));
// Codifica Base64 per dati complessi
const complexData = { name: "José", age: 30, city: "São Paulo" };
document.cookie = `userData=${btoa(JSON.stringify(complexData))}; path=/`;
// Decodifica Base64
const decodedData = JSON.parse(atob(getCookie('userData')));
Considerazioni sugli attributi dei cookie
Attributo Domain e limitazioni dei caratteri
L'attributo domain nei cookie definisce quali host possono ricevere il cookie. Ecco i punti chiave sull'attributo domain e le sue limitazioni di caratteri:
Caratteri consentiti
- Caratteri alfanumerici (a-z, A-Z, 0-9)
- Trattini (-)
- Punti (.)
Regole per i nomi di dominio
- Devono iniziare e terminare con caratteri alfanumerici
- Non possono contenere punti consecutivi
- Lunghezza massima di 253 caratteri
Considerazioni sui sottodomini
- Impostare il dominio su un sottodominio specifico limita il cookie a quel sottodominio
- L'uso di un punto iniziale (.) permette al cookie di essere condiviso con i sottodomini
Esempio: Impostazioni di dominio valide e non valide
| Impostazioni di dominio valide | Impostazioni di dominio non valide |
|---|---|
| esempio.com | .esempio.com (punto iniziale) |
| sub.esempio.com | esempio..com (punti consecutivi) |
| mio-sito.com | -esempio.com (inizia con trattino) |
| 123.esempio.com | esempio.com- (termina con trattino) |
Esempio: Impostazione dell'attributo Domain
// Cookie per un sottodominio specifico
document.cookie = "nome=valore; domain=sottodominio.esempio.com";
// Cookie condiviso con tutti i sottodomini
document.cookie = "nome=valore; domain=esempio.com";
Attributi Expires e Max-Age
Gli attributi Expires e Max-Age controllano quando un cookie deve essere eliminato.
Attributo Expires
- Usa il fuso orario GMT/UTC
- Formato: "Wdy, DD-Mon-YYYY HH:MM:SS GMT"
- Esempio: "Wed, 21 Oct 2023 07:28:00 GMT"
Attributo Max-Age
- Numero intero positivo che rappresenta i secondi
- Il valore massimo dipende dall'implementazione del browser (tipicamente circa 2^31 - 1)
Esempio: Expires vs Max-Age
| Caratteristica | Expires | Max-Age |
|---|---|---|
| Riferimento temporale | Data assoluta | Relativo al tempo attuale |
| Formato | Stringa di data | Numero di secondi |
| Supporto browser | Tutti i browser | La maggior parte dei browser moderni |
| Precedenza | Inferiore | Superiore (se entrambi impostati) |
Esempio: Impostazione della scadenza
// Uso dell'attributo Expires
const expirationDate = new Date();
expirationDate.setDate(expirationDate.getDate() + 7);
document.cookie = `nome=valore; expires=${expirationDate.toUTCString()}`;
// Uso dell'attributo Max-Age (7 giorni in secondi)
document.cookie = "nome=valore; max-age=604800";
Attributi aggiuntivi dei cookie
Attributo Secure
- Assicura che il cookie sia inviato solo tramite HTTPS
- Utilizzo:
document.cookie = "nome=valore; secure";
Attributo HttpOnly
- Impedisce l'accesso al cookie tramite script lato client
- Aiuta a ridurre gli attacchi di cross-site scripting (XSS)
- Utilizzo:
document.cookie = "nome=valore; HttpOnly";
Attributo SameSite
Controlla quando i cookie vengono inviati con richieste cross-site:
- Strict: Invia solo per richieste dello stesso sito
- Lax: Invia per richieste dello stesso sito e navigazione di primo livello da siti esterni
- None: Consente l'invio cross-site (richiede l'attributo Secure)
Esempio: Impostazione dell'attributo SameSite
document.cookie = "nome=valore; SameSite=Strict";





