Является ли имя файла cookie чувствительным?

HTTP Cookie состоит из пары имя-значение и может быть задано сервером с использованием этого ответа:

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: name=value
Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT

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

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: name=value; name2=value2

Является ли имя файла cookie чувствительным?

Например, если мой сервер отправляет ответ как таковой:

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: Aaaa=Bbbb
Set-Cookie: aAaa=bBbb
Set-Cookie: aaAa=bbBb
Set-Cookie: aaaA=bbbB

Можно ли ожидать, что клиент (Chrome, FireFox, Safari, IExplorer, Opera и т.д.) отправит будущие запросы с заголовком Cookie: Aaaa=Bbbb; aAaa=bBbb; aaAa=bbBb; aaaA=bbbB;?

Примечание. Вопрос не является ни JSP-специфичным, ни специфичным для PHP, ни ASP-специфическим.

Ответ 1

Имена файлов cookie зависят от регистра. В RFC не указано это явно, но каждое нечувствительное к регистру сравнение указано так явно, и нет такого явного выражения относительно имени файла cookie. Chrome и Firefox обрабатывают файлы cookie как с учетом регистра и сохраняют все варианты вариантов в виде отдельных файлов cookie.

Тестовый пример (PHP):

print_r($_COOKIE);

setcookie('foo', '123');
setcookie('Foo', '456');

Загрузите script дважды, наблюдайте $_COOKIE дамп при втором запуске.

Ответ 2

Кажется, что файлы cookie на самом деле чувствительны к регистру. Есть некоторые путаницы с этим. Интересно, что MSDN говорит иначе:

Имена файлов cookie не зависят от регистра.

Источник: http://msdn.microsoft.com/en-us/library/ms970178.aspx в нижней части статьи говорится, что он ©2002, поэтому он может быть устаревшим.

Кроме того, на форумах asp.net задан вопрос: http://forums.asp.net/t/1170326.aspx?Are+cookie+names+case+sensitive+ и кажется, что ответ - чувствительным.

Что происходит? MSDN говорит "нет", другие технологии говорят "да". Конечно, я тестировал это, используя ASP classic.

код

hashUCASE = Request.Cookies("data")("Hash")
hashLCASE = Request.Cookies("data")("hash")

Response.Write "<p> hashUCASE = " & hashUCASE
Response.Write "<br> hashLCASE = " & hashLCASE


cookieNameUCASE = Request.Cookies("Data")
cookieNameLCASE = Request.Cookies("data")

Response.Write "<p> cookieNameUCASE = " & cookieNameUCASE
Response.Write "<br> cookieNameLCASE = " & cookieNameLCASE

Response.End

Результаты

hashUCASE: EE3305C0DAADAAAA221BD5ACF6996AAA
hashLCASE: EE3305C0DAADAAAA221BD5ACF6996AAA

cookieNameUCASE: name=1&Hash=EE3305C0DAADAAAA221BD5ACF6996AAA
cookieNameLCASE: name=1&Hash=EE3305C0DAADAAAA221BD5ACF6996AAA

Как вы можете видеть в результатах, значение "Хэш" было создано с прописными буквами, и даже когда вы делаете запрос в нижнем регистре, оно возвращает то же значение, что делает его не чувствительным к регистру. В соответствии с этой технологией MS это не так.

Заключение

Итак, используя Request.Cookies() в ASP classic, он не чувствителен к регистру, как говорит Microsoft. Но подождите, не так ли, если он будет чувствителен к регистру? Это может означать, что независимо от того, чувствительна она или нет, зависит от технологии на стороне сервера, которая делает запрос в браузере, что может нормализировать имя файла cookie для внесения запросов и, таким образом, сделать его чувствительным к регистру. Но что-то еще нам нужно проверить, чтобы проверить.

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

TL;DR

Пока вы сохраняете соглашение с именами файлов cookie, у вас не будет проблем с чувствительностью к регистру.

Ответ 3

Внизу находится script, который демонстрирует чувствительность к регистру файлов cookie в браузерах и .Net framework. Каждый раз, когда он запускается, он вставляет файл cookie с именем xxxxxxxxxx со случайными верхними/нижними регистрами. Нажмите F5, чтобы обновить несколько раз, чтобы вставить несколько файлов cookie.

У меня есть teste на Chrome и Firefox, и оба демонстрируют подобное поведение, как показано ниже:

Request.Cookies["xxxxxxxxxx"].Name returns: xxxxXxXXXX
All XXXXXXXXXX Cookies:

    xxxxXxXXXX
    xXxxXxXXXx
    XxxxxXxXXx
    XXXxXxXXxX

Он показывает:

  • Файлы cookie учитывают регистр в Chrome и Firefox.
  • .Net Framework может обрабатывать файлы cookie, чувствительные к регистру (для чего он может перемещаться через все эти файлы cookie).
  • Request.Cookies [ "xxxxxxxxxx" ] нечувствителен к регистру (поэтому он возвращает первый файл cookie, который не учитывает регистр).

Как упоминалось в других ответах, новый RFC указывает, что файлы cookie чувствительны к регистру, и как Chrome, так и Firefox, похоже, справляются с этим..Net Framework может обрабатывать файлы cookie, чувствительные к регистру, но он действительно хочет обрабатывать файлы cookie без учета регистра, и многие из его функций обрабатывают файлы cookie таким образом (Cookies [], Cookies.Set() и т.д.). Эта несогласованность может вызвать много трудностей для отслеживания ошибок.

TestCookie.aspx:

<%@ Page language="c#" AutoEventWireup="false" validateRequest=false %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title id="title">Test Cookie Sensitivity</title>
</head>
<body>
<p>Request.Cookies["xxxxxxxxxx"].Name returns:
<%
    HttpCookie cookie2 = Request.Cookies["xxxxxxxxxx"];
    if (cookie2 == null) Response.Write("No cookie found");
    else Response.Write(cookie2.Name);
%>
</p>
<h3>All XXXXXXXXXX Cookies:</h3>
<ul>
<%
    foreach (string key in Request.Cookies.Keys)
        if (key.ToLower() == "xxxxxxxxxx") Response.Write("<li>" + key + "</li>");
    Random rand = new Random();
    StringBuilder name = new StringBuilder();
    for (int i = 0; i < 10; i++) {
        if (rand.Next(2) == 0) name.Append('x');
        else name.Append('X');
    }
    HttpCookie cookie = new HttpCookie(name.ToString());
    cookie.HttpOnly = true;
    cookie.Expires = DateTime.Now.AddMonths(1);
    Response.Cookies.Add(cookie);
%>
</ul>
</body>
</html>

Ответ 4

Согласно RFC 2109 - Механизм управления HTTP-протоколом имена файлов cookie aka имена атрибутов нечувствительны к регистру:

4.1 Синтаксис: общий

Два заголовка управления состоянием, Set-Cookie и Cookie, имеют общие    синтаксические свойства, включающие пары атрибут-значение. Следующие    грамматика использует обозначение и токены DIGIT (десятичные цифры) и    (неофициально, последовательность неспециального, небелого пространства    символов) из спецификации HTTP/1.1 [RFC 2068] для описания    их синтаксис.

av-pairs        =       av-pair *(";" av-pair)
av-pair         =       attr ["=" value]        ; optional value
attr            =       token
value           =       word
word            =       token | quoted-string

Атрибуты (имена) (attr) не чувствительны к регистру. Белое пространство    разрешено между токенами. Обратите внимание, что хотя указанный выше синтаксис    описание показывает значение как необязательное, большинство требований требуют их.

Ответ 5

Согласно MSDN, имя cookie не чувствительно к регистру. Однако я не уверен, что это просто реализация ASPX/IIS. Я считаю, что это зависит и от веб-сервера, и от языка.

Если вы отправите куки файл с именем "UserID", браузер обязательно вернет его как "UserID", а не "userid".