ten jest szybki:
Możesz myśleć, że tak powinno być, ale tak naprawdę wcale nie jest!
Jakie są dozwolone znaki zarówno w nazwie pliku cookie, jak i wartości?
Według starożytnego Netscape cookie_spec cały NAME=VALUE
ciąg to:
sekwencja znaków z wyłączeniem średnika, przecinka i białych znaków.
Tak -
powinno działać, i wydaje się być OK w przeglądarkach, które tu mam; gdzie masz z tym problem?
Implikując powyższe:
=
jest to legalne, ale potencjalnie dwuznaczne. Przeglądarki zawsze dzielą nazwę i wartość na pierwszy =
symbol w ciągu, więc w praktyce możesz umieścić =
symbol w WARTOŚCI, ale nie NAZWĘ.
Co nie jest wspomniane, ponieważ Netscape był okropny w pisaniu specyfikacji, ale wydaje się być konsekwentnie obsługiwany przez przeglądarki:
NAZWA lub WARTOŚĆ mogą być pustymi ciągami
jeśli =
w łańcuchu nie ma żadnego symbolu, przeglądarki traktują go jako plik cookie o nazwie pustego łańcucha, tzn. Set-Cookie: foo
jest taki sam jak Set-Cookie: =foo
.
gdy przeglądarki wysyłają plik cookie o pustej nazwie, pomijają znak równości. Więc Set-Cookie: =bar
zaczyna Cookie: bar
.
przecinki i spacje w nazwach i wartościach faktycznie działają, chociaż spacje wokół znaku równości są przycięte
znaki kontrolne ( \x00
na \x1F
plus \x7F
) są niedozwolone
To, czego nie wspomniano, a przeglądarki są całkowicie niespójne, to znaki spoza ASCII (Unicode):
- w Operze i Google Chrome są one kodowane w nagłówkach Cookie za pomocą UTF-8;
- w IE używana jest domyślna strona kodowa komputera (specyficzna dla ustawień regionalnych i nigdy UTF-8);
- Firefox (i inne przeglądarki oparte na Mozilli) same używają niskiego bajtu każdego punktu kodowego UTF-16 (więc ISO-8859-1 jest OK, ale wszystko inne jest zniekształcone);
- Safari po prostu odmawia wysłania pliku cookie zawierającego znaki spoza ASCII.
dlatego w praktyce w plikach cookie nie można w ogóle używać znaków spoza ASCII. Jeśli chcesz korzystać z Unicode, kodów sterujących lub innych dowolnych sekwencji bajtów, cookie_spec wymaga użycia schematu kodowania ad-hoc według własnego wyboru i zasugerowania kodowania URL-a (wyprodukowanego przez JavaScript encodeURIComponent
) jako rozsądnego wyboru.
Pod względem faktycznych standardów podjęto kilka prób skodyfikowania zachowania plików cookie, ale jak dotąd żadne nie odzwierciedla rzeczywistego świata.
RFC 2109 to próba skodyfikowania i naprawy oryginalnego pliku cookie Netscape. W tym standardzie wiele innych znaków specjalnych jest niedozwolonych, ponieważ używa on tokenów RFC 2616 (a -
jest tam nadal dozwolone) i tylko wartość może być określona w cudzysłowie z innymi znakami. Żadna przeglądarka nigdy nie wdrożyła ograniczeń, specjalnej obsługi cytowanych ciągów znaków i znaków zmiany znaczenia ani nowych funkcji w tej specyfikacji.
RFC 2965 był kolejnym krokiem w tym kierunku, uporządkując 2109 i dodając więcej funkcji w ramach schematu „ciasteczka w wersji 2”. Nikt też tego nie wdrożył. Ta specyfikacja ma takie same ograniczenia tokenów i cytowanych ciągów jak wcześniejsza wersja i jest to tak samo dużo bzdur.
RFC 6265 to próba wyczyszczenia historycznego bałaganu z czasów HTML5. Nadal nie pasuje dokładnie do rzeczywistości, ale jest o wiele lepszy niż wcześniejsze próby - to przynajmniej odpowiedni podzbiór obsługiwanych przeglądarek, nie wprowadzający żadnej składni, która powinna działać, ale nie działa (jak poprzedni ciąg cytowany) .
W 6265 nazwa pliku cookie jest nadal określana jako RFC 2616 token
, co oznacza, że możesz wybierać z alfanum plus:
!#$%&'*+-.^_`|~
W wartości cookie formalnie zakazuje (filtrowane przez przeglądarki) znaki kontrolne i (niekonsekwentnie) znaki spoza ASCII. Zachowuje zakaz cookie_spec dotyczący spacji, przecinków i średników, a także dla zgodności z wszelkimi słabymi idiotami, którzy faktycznie wdrożyli wcześniejsze RFC, zakazał także odwrotnego ukośnika i cytatów, innych niż cytaty zawijające całą wartość (ale w takim przypadku cytaty są nadal uważane za część wartość, a nie schemat kodowania). Dzięki temu masz alfanum plus:
!#$%&'()*+-./:<=>?@[]^_`{|}~
W prawdziwym świecie nadal używamy oryginalnego i najgorszego Netscape cookie_spec, więc kod, który zużywa pliki cookie, powinien być przygotowany na prawie wszystko, ale w przypadku kodu, który wytwarza pliki cookie, zaleca się pozostawanie przy podzbiorze w RFC 6265.
;
znak, dopóki są otoczone podwójnymi cudzysłowami? Jako taki:Set-Cookie: Name=Va";"lue; Max-Age=3600