Обработка закодированных значений cookie в C # - PullRequest
3 голосов
/ 21 августа 2009

Согласно RFC 2109 , значение cookie "непрозрачно для пользовательского агента и может быть любым, что сервер отправления выберет для отправки, возможно, в выбранной для печати кодировке ASCII для сервера."

Вследствие этого разные языки / платформы / сервер отправляют разные значения cookie, даже если исходное значение одинаково.

Например, C # / ASP.NET отправляет текст как есть; классические ASP urlencodes и urldecodes текст; Perl / Apache urlencodes / расшифровывает текст (но отличается от ASP!). Php дает вам возможность.

Я пишу систему с единым входом, для которой требуется обмен файлами cookie с различными приложениями. В частности, у меня есть .NET, Java, Perl, ColdFusion, которые необходимо поддерживать "из коробки".

Текст, который я храню в cookie, всегда является допустимой ASCII-7 строкой. Тем не менее, Perl любит кодировать некоторые 7-битные символы ASCII, например.

Я вижу две основные альтернативы, чтобы сделать эту работу:

  1. Принимайте только некодированные значения. Ведь нет необходимости кодировать их. Вот как это сейчас. Очевидно, что все интегрированные системы должны поддерживать некодированные значения.

  2. Принимайте как закодированные, так и некодированные значения. Это позволило бы обеспечить максимальную совместимость из коробки, но мне нужно было бы определить, закодировано ли конкретное значение или нет (что звучит совершенно невозможно: "% 20" - буквальная строка "% 20" или пробел?)

Какое решение вы бы предложили и почему? Если это # ​​2, как бы вы обнаружили UrlEncoded текст?


Пример файла cookie (я добавил разрывы строк, чтобы он подходил)

A5A2794D694241AD92F9B22F288EFAA1|8428DCCC|20090821142732|20090821142832|
10.100.107.40|955098D50AB4982D4E247EFA53F4E23B32A05ED0131E096709BE1D8CCC
8A3CA18252D376473C244FD71C462AB42CF54C

Ответы [ 2 ]

3 голосов
/ 21 августа 2009

Да, это не тривиальная проблема. По сути, я больше склоняюсь к решению № 2, поскольку оно наиболее совместимо. Однако, как вы говорите, довольно просто определить, какие файлы cookie имеют URL-кодировку, а какие нет.

Одна вещь, которая приходит мне в голову, это то, что вы можете использовать некоторые специальные символы для дополнения начала ваших значений Cookie и таким образом вы можете определить, закодирован ли Cookie или нет. Конечно, это может не охватывать всех клиентов, но, например, если ваши обычные значения cookie имеют вид CookieValue1234, вы можете изменить его на head :CookieValue1234 и установить флажок Посмотрите, вернется ли пробел туда, где закодирован URL или нет (то есть возвращается как "%20" или как "").

1 голос
/ 21 августа 2009

По какой причине вы не можете указать чисто буквенно-цифровое значение? Если у вас есть непрозрачные двоичные данные, которые вы пытаетесь сохранить, тогда вы можете либо использовать шестнадцатеричный код, либо использовать «безопасную сеть» base64.

Чем меньше вероятность того, что кто-то возится с вашим cookie на всех , тем лучше IMO.

...