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=VALUEcią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: foojest 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: =barzaczyna 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 ( \x00na \x1Fplus \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