Запятая является допустимым символом в значении cookie

На некоторых веб-серверах файл cookie со значением запятой будет разделен на два файла cookie (один с пустым значением). Например, "foo=bar,goo" будет рассматриваться как "foo=bar;goo=", Это правильно в соответствии с RFC?

Я нахожу этот документ RFC, но не знаю точно, что это значит.

cookie-pair       = cookie-name "=" cookie-value
cookie-name       = token
cookie-value      = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
cookie-octet      = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
                   ; US-ASCII characters excluding CTLs,
                   ; whitespace DQUOTE, comma, semicolon,
                   ; and backslash

RFC 6265

4 ответа

Решение
cookie-pair       = cookie-name "=" cookie-value
cookie-name       = token
cookie-value      = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
cookie-octet      = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
                   ; US-ASCII characters excluding CTLs,
                   ; whitespace DQUOTE, comma, semicolon,
                   ; and backslash

Что это за ключевые слова: cookie-пара, cookie-имя, cookie-значение, cookie-октет?

cookie-value правая часть =,

cookie-octet является реальным значением, заключенным в двойные кавычки или ничего. Увидеть:

key="value"

или же

key=value

Когда вы кладете в , (или же ;) посмотрим что получится

key="value,",key2="value2"

или же

key=value,,key2=value2

Таким образом, ваше предположение не совсем верно, и вы не должны использовать запятую или точку с запятой внутри значения.

НЕТ они не допускаются.

Из спецификации:

Эта строка представляет собой последовательность символов, исключая точку с запятой, запятую и пробел.

То же самое можно проверить в RFC2965 и RFC2616.

Согласно части документа, которую вы указали, запятые не допускаются:

US-ASCII characters excluding CTLs, whitespace DQUOTE, comma, semicolon, and backslash

Тем не менее, я полагаю, что все современные браузеры позволяют это в любом случае, поэтому используйте его на свой страх и риск. Вы всегда можете использовать base64 или что-то подобное в зависимости от вашей цели, если вам нужно кодировать специальные символы и соблюдать совместимость.

Спецификация 6265 RFC и другие подобные спецификации используют грамматику ABNF :

      cookie-octet      = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
                   ; US-ASCII characters excluding CTLs,
                   ; whitespace DQUOTE, comma, semicolon,
                   ; and backslash

Строки, начинающиеся с;являются комментариями. Они полезны, но не имеют грамматического значения.

Косые черты/отдельные альтернативы.

Литеральные символы и диапазоны указываются с использованием восьмеричного представления:

      %x21 is !
%x23-2B encompass the characters # $ % & ' ( ) * +
%x2D-3A encompass the characters - . / 0-9 :
%x3C-5B encompass the characters < = > ? @ A-Z [
%x5D-7E encompass the characters ] ^ _ ` a-z { | } ~

Код запятой0x2Cне включен ни в один из диапазонов, что делает его недопустимым символом для использования вcookie-octetилиcookie-value.

Другие вопросы по тегам