це швидке:
Ви можете подумати, що має бути, але насправді це зовсім не так!
Які дозволені символи мають і ім’я файлу cookie, і значення?
Відповідно до стародавнього cookie_spec Netscape, весь NAME=VALUE
рядок:
послідовність символів, що виключає крапки з комою, комою та пробілом.
Так -
має працювати, і, схоже, це добре в браузерах, у яких я потрапив сюди; де у вас проблеми?
Під впливом вищезазначеного:
=
є законним, але потенційно неоднозначним. Браузери завжди розділяють ім'я та значення на першому =
символі в рядку, тому на практиці ви можете помістити =
символ у значення "VALUE", а не "NAME".
Що не згадується, оскільки Netscape був жахливим при написанні специфікацій, але, схоже, підтримується браузерами:
або NAME, або VALUE можуть бути порожніми рядками
якщо =
символу в рядку немає взагалі, браузери розглядають його як печиво з назвою порожнього рядка, тобто Set-Cookie: foo
таке ж, як Set-Cookie: =foo
.
коли браузери видають печиво з порожнім ім'ям, вони опускають знак рівності. Так і Set-Cookie: =bar
починається Cookie: bar
.
коми і пробіли в іменах та значеннях насправді, здається, працюють, хоча пробіли навколо знака рівності оброблені
контрольні символи ( \x00
до \x1F
плюс \x7F
) заборонені
Те, що не згадується, і браузери абсолютно непослідовні, це символи, що не належать до ASCII (Unicode):
- в Opera та Google Chrome вони кодуються до заголовків Cookie з UTF-8;
- в IE використовується сторінка коду за замовчуванням машини (специфічна для локального типу та ніколи не UTF-8);
- Firefox (та інші браузери на базі Mozilla) використовують низький байт кожної кодової точки UTF-16 самостійно (тому ISO-8859-1 добре, але все інше налаштовано);
- Safari просто відмовляється надсилати файли cookie, що містять символи, що не належать до ASCII.
тому на практиці ви взагалі не можете використовувати символи, що не належать до ASCII. Якщо ви хочете використовувати Unicode, контрольні коди або інші довільні байтові послідовності, cookie_spec вимагає використовувати спеціальну схему кодування за власним вибором і запропонувати кодування URL (як вироблено JavaScript encodeURIComponent
) як розумний вибір.
Що стосується фактичних стандартів, то було декілька спроб кодифікувати поведінку файлів cookie, але жодна поки що насправді не відображає реальний світ.
RFC 2109 була спробою кодифікувати та виправити оригінальний файл cookie_spec Netscape. У цьому стандарті багато інших спеціальних символів заборонені, оскільки в ньому використовуються RFC 2616 лексеми (a -
все ще дозволено там), і лише значення може бути вказане в рядку з цитатами з іншими символами. Жоден веб-переглядач ніколи не реалізовував обмежень, спеціального поводження з цитованими рядками та скачуванням або нових функцій у цій специфікації.
RFC 2965 - це ще одна робота, прибираючи 2109 та додаючи додаткові можливості за схемою "cookie версії 2". Ніхто ніколи цього не реалізував. Ця специфікація має ті ж обмеження, що цитуються на основі лексем і цитувань, як і в попередній версії, і це так само велика кількість дурниць.
RFC 6265 - це спроба епохи HTML5 очистити історичний безлад. Він все ще не відповідає дійсності, але набагато краще, ніж попередні спроби - це принаймні належний підмножина того, що підтримують браузери, не вводячи жодного синтаксису, який повинен працювати, але не працює (як попередній цитуваний рядок) .
У 6265 році ім'я файлу cookie все ще вказано як RFC 2616 token
, що означає, що ви можете вибрати з літер плюс:
!#$%&'*+-.^_`|~
У значенні cookie він формально забороняє (відфільтровані браузерами) контрольні символи та (непослідовно реалізовані) символи, що не належать до ASCII. Він зберігає заборону cookie_spec на простір, кому та крапку з комою, а також на сумісність з будь-якими бідними ідіотами, які фактично реалізували попередні RFC, він також заборонив зворотну косу рису та котирування, крім цитат, що містять ціле значення (але в цьому випадку цитати досі вважаються частиною значення, а не схема кодування). Таким чином, це залишає вам літери плюс:
!#$%&'()*+-./:<=>?@[]^_`{|}~
У реальному світі ми все ще використовуємо оригінальний і найгірший Netscape cookie_spec, тому код, який споживає файли cookie, повинен бути готовий зустріти майже все, але для коду, який створює файли cookie, бажано дотримуватися підмножини в RFC 6265.
;
характер, якщо вони оточені подвійними лапками? Як таке:Set-Cookie: Name=Va";"lue; Max-Age=3600