это быстрый
Вы можете подумать, что так и должно быть, но на самом деле это совсем не так!
Каковы допустимые символы в имени и значении файла cookie?
Согласно древнему Netscape cookie_spec, вся NAME=VALUE
строка выглядит так:
последовательность символов, исключая точку с запятой, запятую и пробел.
Так -
должно работать, и, похоже, все в порядке в браузерах, которые у меня здесь есть; где у вас проблемы с этим?
Подразумевается вышеизложенное:
=
законно включить, но потенциально неоднозначно. Браузеры всегда разделяют имя и значение по первому =
символу в строке, поэтому на практике вы можете поместить =
символ в VALUE, но не в NAME.
Что не упомянуто, потому что Netscape были ужасны в написании спецификаций, но, похоже, постоянно поддерживаются браузерами:
ИМЯ или ЗНАЧЕНИЕ могут быть пустыми строками
если =
в строке вообще нет символа, браузеры обрабатывают его как файл cookie с именем пустой строки, то 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 был попыткой кодификации и исправления оригинального Netscape cookie_spec. В этом стандарте многих других специальных символов запрещены, так как он использует RFC 2616 маркеров (а -
это по- прежнему разрешено там), и только значение может быть указано в кавычках струны с другими персонажами. Ни один браузер никогда не реализовывал ограничения, специальную обработку строк в кавычках и экранирование или новые функции в этой спецификации.
RFC 2965 был еще одним шагом, прибравшим 2109 и добавляющим больше возможностей по схеме «куки версии 2». Никто никогда не реализовывал ничего из этого. Эта спецификация имеет те же ограничения по токенам и кавычкам, что и в предыдущей версии, и это такая же ерунда.
RFC 6265 - это попытка навести порядок в истории HTML5. Это все еще не соответствует действительности точно, но это намного лучше, чем предыдущие попытки - это по крайней мере правильное подмножество того, что поддерживают браузеры, не вводя синтаксис, который должен работать, но не работает (как предыдущая строка в кавычках) ,
В 6265 имя cookie по-прежнему указывается как RFC 2616 token
, что означает, что вы можете выбрать из алфавитов плюс:
!#$%&'*+-.^_`|~
В значении cookie он формально запрещает (отфильтрованные браузерами) управляющие символы и (непоследовательно реализованные) не-ASCII символы. Он сохраняет запрет cookie_spec на пробел, запятую и точку с запятой, плюс для совместимости с любыми плохими идиотами, которые фактически реализовали более ранние RFC, он также запретил обратную косую черту и кавычки, кроме кавычек, охватывающих все значение (но в этом случае кавычки все еще считаются частью значение, а не схема кодирования). Так что это оставляет вас с alphanums плюс:
!#$%&'()*+-./:<=>?@[]^_`{|}~
В реальном мире мы все еще используем исходный и худший Netscape cookie_spec, поэтому код, который использует куки, должен быть готов встретить практически все, но для кода, который генерирует куки, рекомендуется придерживаться подмножества в RFC 6265.
;
символ, если он заключен в двойные кавычки? Как таковой:Set-Cookie: Name=Va";"lue; Max-Age=3600