Das ist ein Quickie:
Sie könnten denken, es sollte sein, aber es ist wirklich überhaupt nicht!
Was sind die zulässigen Zeichen in Cookie-Name und Wert?
Laut der alten Netscape cookie_spec ist die gesamte NAME=VALUE
Zeichenfolge:
Eine Folge von Zeichen ohne Semikolon, Komma und Leerzeichen.
Sollte also -
funktionieren, und es scheint in Browsern, die ich hier habe, in Ordnung zu sein; Wo hast du Probleme damit?
Aus impliziten Gründen:
=
ist legal einzuschließen, aber möglicherweise mehrdeutig. Browser teilen immer den Namen und den Wert des ersten =
Symbols in der Zeichenfolge auf, sodass Sie in der Praxis ein =
Symbol in den Wert, aber nicht in den Namen einfügen können.
Was nicht erwähnt wird, weil Netscape schrecklich darin war, Spezifikationen zu schreiben, aber von Browsern konsequent unterstützt zu werden scheint:
entweder der NAME oder der VALUE können leere Zeichenfolgen sein
Wenn =
die Zeichenfolge überhaupt kein Symbol enthält, wird sie von den Browsern als Cookie mit dem Namen der leeren Zeichenfolge behandelt, dh es Set-Cookie: foo
ist dasselbe wie Set-Cookie: =foo
.
Wenn Browser ein Cookie mit einem leeren Namen ausgeben, wird das Gleichheitszeichen weggelassen. Also Set-Cookie: =bar
zeugt Cookie: bar
.
Kommas und Leerzeichen in Namen und Werten scheinen tatsächlich zu funktionieren, obwohl Leerzeichen um das Gleichheitszeichen gekürzt werden
Steuerzeichen ( \x00
bis \x1F
plus \x7F
) sind nicht erlaubt
Was nicht erwähnt wird und Browser völlig inkonsistent sind, sind Nicht-ASCII-Zeichen (Unicode):
- In Opera und Google Chrome werden sie mit UTF-8 in Cookie-Header codiert.
- Im IE wird die Standardcodepage des Computers verwendet (länderspezifisch und niemals UTF-8).
- Firefox (und andere Mozilla-basierte Browser) verwenden das Low-Byte jedes UTF-16-Codepunkts für sich (ISO-8859-1 ist also in Ordnung, aber alles andere ist verstümmelt).
- Safari lehnt es einfach ab, Cookies zu senden, die Nicht-ASCII-Zeichen enthalten.
In der Praxis können Sie daher in Cookies überhaupt keine Nicht-ASCII-Zeichen verwenden. Wenn Sie Unicode, Steuercodes oder andere beliebige Bytesequenzen verwenden möchten, fordert cookie_spec, dass Sie ein Ad-hoc-Codierungsschema Ihrer Wahl verwenden und eine URL-Codierung (wie von JavaScript erstellt encodeURIComponent
) als vernünftige Wahl vorschlagen .
In Bezug auf die tatsächlichen Standards gab es einige Versuche, das Verhalten von Cookies zu kodifizieren, aber bisher spiegelte keiner tatsächlich die reale Welt wider.
RFC 2109 war ein Versuch, die ursprüngliche Netscape cookie_spec zu codieren und zu reparieren. In diesem Standard sind viele weitere Sonderzeichen nicht zulässig , da RFC 2616- Token verwendet werden (a -
ist dort noch zulässig), und nur der Wert darf in einer Zeichenfolge in Anführungszeichen mit anderen Zeichen angegeben werden. Kein Browser hat jemals die Einschränkungen, die spezielle Behandlung von Zeichenfolgen und Escapezeichen in Anführungszeichen oder die neuen Funktionen in dieser Spezifikation implementiert.
RFC 2965 war ein weiterer Versuch, 2109 aufzuräumen und weitere Funktionen im Rahmen eines Cookies der Version 2 hinzuzufügen. Auch das hat noch niemand umgesetzt. Diese Spezifikation hat die gleichen Einschränkungen für Token und Zeichenfolgen wie die frühere Version und ist genauso viel Unsinn.
RFC 6265 ist ein Versuch aus der HTML5-Ära, das historische Durcheinander zu beseitigen. Es stimmt immer noch nicht genau mit der Realität überein, aber es ist viel besser als die früheren Versuche - es ist zumindest eine richtige Teilmenge dessen, was Browser unterstützen, und führt keine Syntax ein, die funktionieren soll, aber nicht funktioniert (wie die zuvor zitierte Zeichenfolge). .
In 6265 wird der Cookie-Name immer noch als RFC 2616 angegeben token
, was bedeutet, dass Sie aus den Alphanums plus auswählen können:
!#$%&'*+-.^_`|~
Im Cookie-Wert werden die (nach Browsern gefilterten) Steuerzeichen und (inkonsistent implementierten) Nicht-ASCII-Zeichen formell gesperrt. Das Verbot von Leerzeichen, Komma und Semikolon von cookie_spec sowie die Kompatibilität mit armen Idioten, die die früheren RFCs implementiert haben, wurden beibehalten. Außerdem wurden Backslash und Anführungszeichen verboten, außer Anführungszeichen, die den gesamten Wert umschließen (in diesem Fall werden die Anführungszeichen jedoch weiterhin als Teil von betrachtet der Wert, kein Kodierungsschema). So bleiben Ihnen die Alphanums plus:
!#$%&'()*+-./:<=>?@[]^_`{|}~
In der realen Welt verwenden wir immer noch die ursprünglichste und schlechteste Netscape cookie_spec. Daher sollte Code, der Cookies verwendet, auf so ziemlich alles vorbereitet sein. Für Code, der Cookies erzeugt, ist es jedoch ratsam, sich an die Teilmenge in RFC 6265 zu halten.
;
Charakter haben können, solange sie in doppelte Anführungszeichen gesetzt sind? Als solche:Set-Cookie: Name=Va";"lue; Max-Age=3600