Problem: Einschränkungen bei Cookie-Zeichen
Bei der Erstellung von Cookies für Webanwendungen müssen Sie die Zeichenbeschränkungen kennen. Nicht alle Zeichen können in Cookie-Namen und -Werten verwendet werden. Dies kann bei falscher Verwendung zu Problemen führen. Die Kenntnis dieser Grenzen ist wichtig, damit Cookies gut funktionieren und Sicherheitsrisiken vermieden werden.
Browserseitige Umsetzung der Cookie-Zeichenbeschränkungen
Gängige Browser-Praktiken
Webbrowser handhaben Cookie-Zeichenbeschränkungen ähnlich, um Webstandards zu folgen. Hier einige gängige Praktiken:
URL-Kodierung von Sonderzeichen
Browser wenden URL-Kodierung auf Sonderzeichen in Cookie-Werten an. Dies konvertiert Zeichen, die in URLs nicht erlaubt sind, in ein sicheres Format.
Zeichen | URL-kodiert |
---|---|
Leerzeichen | %20 |
= | %3D |
& | %26 |
+ | %2B |
/ | %2F |
Beispiel: Setzen eines Cookies mit Sonderzeichen
document.cookie = "user_info=John Doe & Co.; path=/";
// Browser speichert es als: user_info=John%20Doe%20%26%20Co.
Umgang mit Nicht-ASCII-Zeichen
Die meisten Browser unterstützen UTF-8-Kodierung für Nicht-ASCII-Zeichen in Cookie-Werten. Es ist am besten, diese Zeichen manuell zu kodieren:
Beispiel: Kodierung von Nicht-ASCII-Zeichen
const userName = "José";
document.cookie = `user=${encodeURIComponent(userName)}; path=/`;
// Browser speichert es als: user=Jos%C3%A9
Browser-spezifische Einschränkungen
Browser folgen generell ähnlichen Praktiken, aber es kann Unterschiede in der Handhabung von Cookies geben.
Tipp: Browser-Cookie-Beschränkungen
- Chrome: Bis zu 180 Cookies pro Domain, 4096 Bytes pro Cookie
- Firefox: Bis zu 150 Cookies pro Domain, 4097 Bytes pro Cookie
- Safari: Bis zu 600 Cookies insgesamt, 4093 Bytes pro Cookie
- Internet Explorer: Bis zu 50 Cookies pro Domain, 4096 Bytes pro Cookie
Strategien zum Umgang mit Browser-Einschränkungen
- Aufteilung großer Daten in mehrere Cookies
Beispiel: Aufteilung großer Daten in mehrere Cookies
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=/`;
}
}
// Verwendung
setLargeCookie("user_data", "sehr_langer_string_mit_benutzerdaten");
- Verwendung des lokalen Speichers für clientseitige Daten, die nicht mit jeder Anfrage gesendet werden müssen
Beispiel: Verwendung des lokalen Speichers für große Daten
// Speichern großer Daten im lokalen Speicher
localStorage.setItem('user_preferences', JSON.stringify(großesBenutzerEinstellungenObjekt));
// Abrufen von Daten aus dem lokalen Speicher
const userPreferences = JSON.parse(localStorage.getItem('user_preferences'));
- Implementierung eines Fallback-Mechanismus für Browser mit strengeren Limits
Beispiel: Fallback-Mechanismus für Cookie-Speicherung
function setCookie(name, value, days) {
try {
document.cookie = `${name}=${value}; max-age=${days * 24 * 60 * 60}; path=/`;
} catch (error) {
console.warn(`Fehler beim Setzen des Cookies: ${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);
}
Umgang mit internationalen Zeichen
Bei der Verwendung internationaler Zeichen in Cookies sollten Sie folgende Ansätze berücksichtigen:
- Verwenden Sie
encodeURIComponent()
zum Kodieren unddecodeURIComponent()
zum Dekodieren - Für komplexere Szenarien verwenden Sie
btoa()
undatob()
für Base64-Kodierung
Beispiel: Umgang mit internationalen Zeichen in Cookies
// Kodierung internationaler Zeichen
const internationalName = "안녕하세요";
document.cookie = `greeting=${encodeURIComponent(internationalName)}; path=/`;
// Dekodierung
const storedGreeting = decodeURIComponent(getCookie('greeting'));
// Base64-Kodierung für komplexe Daten
const complexData = { name: "José", age: 30, city: "São Paulo" };
document.cookie = `userData=${btoa(JSON.stringify(complexData))}; path=/`;
// Dekodierung von Base64
const decodedData = JSON.parse(atob(getCookie('userData')));
Cookie-Attribut-Überlegungen
Domain-Attribut und Zeichenbeschränkungen
Das Domain-Attribut in Cookies definiert, welche Hosts das Cookie empfangen können. Hier sind wichtige Punkte zum Domain-Attribut und seinen Zeichenbeschränkungen:
Erlaubte Zeichen
- Alphanumerische Zeichen (a-z, A-Z, 0-9)
- Bindestriche (-)
- Punkte (.)
Regeln für Domainnamen
- Muss mit alphanumerischen Zeichen beginnen und enden
- Darf keine aufeinanderfolgenden Punkte enthalten
- Maximale Länge von 253 Zeichen
Subdomain-Überlegungen
- Setzen der Domain auf eine bestimmte Subdomain beschränkt das Cookie auf diese Subdomain
- Die Verwendung eines führenden Punktes (.) ermöglicht die Freigabe des Cookies für Subdomains
Beispiel: Gültige und ungültige Domain-Einstellungen
Gültige Domain-Einstellungen | Ungültige Domain-Einstellungen |
---|---|
example.com | .example.com (führender Punkt) |
sub.example.com | example..com (aufeinanderfolgende Punkte) |
my-site.com | -example.com (beginnt mit Bindestrich) |
123.example.com | example.com- (endet mit Bindestrich) |
Beispiel: Setzen des Domain-Attributs
// Cookie für spezifische Subdomain
document.cookie = "name=value; domain=subdomain.example.com";
// Cookie für alle Subdomains freigegeben
document.cookie = "name=value; domain=example.com";
Expires- und Max-Age-Attribute
Die Attribute Expires und Max-Age steuern, wann ein Cookie gelöscht werden soll.
Expires-Attribut
- Verwendet die GMT/UTC-Zeitzone
- Format: "Wdy, DD-Mon-YYYY HH:MM:SS GMT"
- Beispiel: "Wed, 21 Oct 2023 07:28:00 GMT"
Max-Age-Attribut
- Positive Ganzzahl, die Sekunden repräsentiert
- Maximaler Wert hängt von der Browser-Implementierung ab (typischerweise um 2^31 - 1)
Beispiel: Expires vs Max-Age
Merkmal | Expires | Max-Age |
---|---|---|
Zeitbezug | Absolutes Datum | Relativ zur aktuellen Zeit |
Format | Datumsstring | Anzahl der Sekunden |
Browser-Unterstützung | Alle Browser | Die meisten modernen Browser |
Vorrang | Niedriger | Höher (wenn beide gesetzt) |
Beispiel: Setzen des Ablaufdatums
// Verwendung des Expires-Attributs
const expirationDate = new Date();
expirationDate.setDate(expirationDate.getDate() + 7);
document.cookie = `name=value; expires=${expirationDate.toUTCString()}`;
// Verwendung des Max-Age-Attributs (7 Tage in Sekunden)
document.cookie = "name=value; max-age=604800";
Zusätzliche Cookie-Attribute
Secure-Attribut
- Stellt sicher, dass das Cookie nur über HTTPS gesendet wird
- Verwendung:
document.cookie = "name=value; secure";
HttpOnly-Attribut
- Verhindert den Zugriff auf das Cookie durch clientseitige Skripte
- Hilft, Cross-Site-Scripting (XSS) Angriffe zu reduzieren
- Verwendung:
document.cookie = "name=value; HttpOnly";
SameSite-Attribut
Kontrolliert, wann Cookies bei Cross-Site-Anfragen gesendet werden:
- Strict: Nur bei Same-Site-Anfragen senden
- Lax: Bei Same-Site und Top-Level-Navigation von externen Seiten senden
- None: Cross-Site-Senden erlauben (erfordert Secure-Attribut)
Beispiel: Setzen des SameSite-Attributs
document.cookie = "name=value; SameSite=Strict";