questa è una sveltina:
Potresti pensare che dovrebbe essere, ma in realtà non lo è affatto!
Quali sono i caratteri consentiti sia nel nome che nel valore del cookie?
Secondo l'antica Netscape cookie_spec l'intera NAME=VALUE
stringa è:
una sequenza di caratteri esclusi punti e virgola, virgola e spazi bianchi.
Quindi -
dovrebbe funzionare, e sembra essere OK nei browser che ho qui; dove hai problemi con esso?
Come conseguenza di quanto sopra:
=
è legale includere, ma potenzialmente ambiguo. I browser dividono sempre il nome e il valore sul primo =
simbolo nella stringa, quindi in pratica puoi inserire un =
simbolo in VALUE ma non in NAME.
Ciò che non è menzionato, perché Netscape è stato terribile nello scrivere le specifiche, ma sembra essere costantemente supportato dai browser:
NAME o VALUE possono essere stringhe vuote
se =
nella stringa non è presente alcun simbolo, i browser lo trattano come il cookie con il nome della stringa vuota, ovvero Set-Cookie: foo
è uguale a Set-Cookie: =foo
.
quando i browser generano un cookie con un nome vuoto, omettono il segno di uguale. Quindi Set-Cookie: =bar
genera Cookie: bar
.
le virgole e gli spazi nei nomi e nei valori sembrano effettivamente funzionare, sebbene gli spazi attorno al segno di uguale siano tagliati
i caratteri di controllo ( \x00
a \x1F
più \x7F
) non sono ammessi
Ciò che non è menzionato e i browser sono totalmente incoerenti, sono i caratteri non ASCII (Unicode):
- in Opera e Google Chrome, sono codificati nelle intestazioni dei cookie con UTF-8;
- in IE, viene utilizzata la tabella codici predefinita della macchina (specifica della locale e mai UTF-8);
- Firefox (e altri browser basati su Mozilla) usano il byte basso di ogni punto di codice UTF-16 da solo (quindi ISO-8859-1 è OK ma tutto il resto è alterato);
- Safari si rifiuta semplicemente di inviare qualsiasi cookie contenente caratteri non ASCII.
quindi in pratica non è possibile utilizzare caratteri non ASCII nei cookie. Se si desidera utilizzare Unicode, codici di controllo o altre sequenze di byte arbitrarie, cookie_spec richiede di utilizzare uno schema di codifica ad hoc di propria scelta e di suggerire la codifica URL (come prodotta da JavaScript encodeURIComponent
) come scelta ragionevole.
In termini di standard effettivi , ci sono stati alcuni tentativi di codificare il comportamento dei cookie, ma nessuno finora riflette effettivamente il mondo reale.
RFC 2109 era un tentativo di codificare e correggere l'originale cookie_spec di Netscape. In questo standard sono vietati molti altri caratteri speciali, in quanto utilizza token RFC 2616 (a -
è ancora consentito lì) e solo il valore può essere specificato in una stringa tra virgolette con altri caratteri. Nessun browser ha mai implementato i limiti, la gestione speciale di stringhe e escape quotati o le nuove funzionalità di questa specifica.
RFC 2965 è stato un altro tentativo, riordinando il 2109 e aggiungendo ulteriori funzionalità in uno schema di "versione 2 cookie". Nemmeno nessuno lo ha mai implementato. Questa specifica ha le stesse limitazioni di token e quoted string della versione precedente ed è altrettanto un carico di sciocchezze.
RFC 6265 è un tentativo dell'era HTML5 di chiarire il disordine storico. Non corrisponde ancora esattamente alla realtà, ma è molto meglio dei tentativi precedenti: è almeno un sottoinsieme corretto di ciò che supporta il browser, non introducendo alcuna sintassi che dovrebbe funzionare ma non funziona (come la stringa tra virgolette precedente) .
Nel 6265 il nome del cookie è ancora specificato come RFC 2616 token
, il che significa che è possibile scegliere tra gli alfani più:
!#$%&'*+-.^_`|~
Nel valore del cookie vieta formalmente i caratteri di controllo (filtrati dai browser) e i caratteri non ASCII (implementati in modo incoerente). Mantiene il divieto di cookie_spec su spazio, virgola e punto e virgola, oltre alla compatibilità con eventuali poveri idioti che hanno effettivamente implementato i precedenti RFC, ha anche vietato barre rovesciate e virgolette, oltre alle virgolette che racchiudono l'intero valore (ma in quel caso le virgolette sono ancora considerate parte di il valore, non uno schema di codifica). In modo che ti lascia con gli alfani più:
!#$%&'()*+-./:<=>?@[]^_`{|}~
Nel mondo reale stiamo ancora usando il cookie_spec Netscape originale e peggiore, quindi il codice che consuma i cookie dovrebbe essere preparato per incontrare praticamente qualsiasi cosa, ma per il codice che produce i cookie è consigliabile attenersi al sottoinsieme in RFC 6265.
;
carattere purché sia racchiuso tra virgolette? Come tale:Set-Cookie: Name=Va";"lue; Max-Age=3600