Совместное использование cookie между субдоменом и доменом

У меня есть два вопроса. Я понимаю, что если я укажу домен как .mydomain.com (с ведущей точкой) в cookie, чтобы все поддомены могли совместно использовать файл cookie.

Может ли subdomain.mydomain.com получить доступ к файлу cookie, созданному в mydomain.com (без субдомена www)?

Может mydomain.com (без субдомена www) получить доступ к файлу cookie, если он создан в subdomain.mydomain.com?

Ответ 1

Два домена mydomain.com и subdomain.mydomain.com могут совместно использовать файлы cookie, только если домен явно указан в заголовке Set-Cookie. В противном случае область действия cookie ограничивается узлом запроса. (Это называется "cookie только для хоста". См. Что такое cookie только для хоста?)

Например, если вы отправили следующий заголовок из subdomain.mydomain.com, то cookie не будет отправляться для запросов в mydomain.com:

Set-Cookie: name=value

Однако, если вы воспользуетесь следующим, он будет использоваться на обоих доменах:

Set-Cookie: name=value; domain=mydomain.com

Этот файл cookie будет отправлен для любого субдомена mydomain.com, включая вложенные субдомены, такие как subsub.subdomain.mydomain.com.

В RFC 2109 домен без ведущей точки означал, что его нельзя использовать на поддоменах, и только ведущая точка (.mydomain.com) позволяла бы его использовать в нескольких поддоменах (но не в верхней домен высокого уровня, поэтому то, что вы спрашиваете, было невозможно в более старой спецификации).

Однако все современные браузеры соответствуют более новой спецификации RFC 6265 и игнорируют любую начальную точку, что означает, что вы можете использовать cookie на поддоменах, а также доменах верхнего уровня.

В итоге, если вы установите cookie, как во втором примере из mydomain.com, он будет доступен для subdomain.mydomain.com, и наоборот. Это также можно использовать, чтобы разрешить sub1.mydomain.com и sub2.mydomain.com обмениваться файлами cookie.

Смотрите также:

Ответ 2

Я не уверен, что ответ @cmbuckley показывает полную картину. Я читаю:

Если атрибуты cookie не указывают на иное, файл cookie        возвращается только на исходный сервер (а не, например, на любой        субдоменов), и он истекает в конце текущего сеанса (как        определяется пользовательским агентом). Пользовательские агенты игнорируют нераспознанный файл cookie.

RFC 6265

Также

8.6.  Weak Integrity

   Cookies do not provide integrity guarantees for sibling domains (and
   their subdomains).  For example, consider foo.example.com and
   bar.example.com.  The foo.example.com server can set a cookie with a
   Domain attribute of "example.com" (possibly overwriting an existing
   "example.com" cookie set by bar.example.com), and the user agent will
   include that cookie in HTTP requests to bar.example.com.  In the
   worst case, bar.example.com will be unable to distinguish this cookie
   from a cookie it set itself.  The foo.example.com server might be
   able to leverage this ability to mount an attack against
   bar.example.com.

Для меня это означает, что вы можете защитить куки от чтения с субдомена/домена, но не можете предотвратить запись куки на другие домены. Таким образом, кто-то может переписать файлы cookie вашего сайта, контролируя другой поддомен, посещаемый тем же браузером. Что не может быть большой проблемой.

Потрясающий тестовый сайт cookie, предоставленный @cmbuckley/для тех, кто пропустил его в своем ответе, как я; стоит прокрутить вверх и вверх /:

Ответ 3

Вот пример использования API cookie DOM (https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie), поэтому мы можем сами убедиться в его поведении.

Если мы выполним следующий JavaScript:

document.cookie = "key=value"

Это похоже на выполнение:

document.cookie = "key=value;domain=mydomain.com"

Ключ cookie становится доступным (только) на домене mydomain.com.


Теперь, если вы выполните следующий JavaScript на mydomain.com:

document.cookie = "key=value;domain=.mydomain.com"

Ключ cookie становится доступным для mydomain.com, а также subdomain.mydomain.com.


Наконец, если вы попытаетесь выполнить на subdomain.mydomain.com следующее:

document.cookie = "key=value;domain=.mydomain.com"

Ключ cookie становится доступным для subdomain.mydomain.com? Я был немного удивлен, что это разрешено; Я предполагал, что для субдомена будет нарушением безопасности возможность установки файла cookie в родительском домене.

Ответ 4

В обоих случаях да, это может быть, и это поведение по умолчанию для IE и Edge.

Другие ответы добавляют ценную информацию, но в основном описывают поведение в Chrome. важно отметить, что поведение в IE совершенно иное. CMBuckley очень полезный тест script демонстрирует, что в (скажем) Chrome куки не распределяются между корневыми и поддоменами, когда домен не указан. Однако тот же тест в IE показывает, что они являются общими. Этот пример IE ближе к описанию перехвата в ссылке CMBuckley www-or-not-www. Я знаю, что это так, потому что у нас есть система, которая использовала различные cookie файлы cookie как для корня, так и для субдомена. Все работало нормально, пока кто-то не обратился к нему в IE, и две системы сражались над тем, чей сеанс cookie выиграл, пока мы не взорвали кеш.

Ответ 5

Обращаем ваше внимание, что вы можете установить cookie файл с субдомена в домене.

(отправлено в ответе на запрос subdomain.mydomain.com)

Set-Cookie: name=value; Domain=mydomain.com // GOOD

Но вы НЕ МОЖЕТЕ установить cookie из домена на поддомене.

(отправлено в ответе на запрос mydomain.com)

Set-Cookie: name=value; Domain=subdomain.mydomain.com // Browser rejects cookie

ПОЧЕМУ?

В соответствии со спецификациями RFC 6265, раздел 5.3.6 Модель хранения

Если канонизированный узел запроса не соответствует домену атрибуту домена: полностью проигнорируйте файл cookie и отмените эти шаги.

и RFC 6265, раздел 5.1.3. Сопоставление доменов

Domain Matching

Строковый домен соответствует заданной доменной строке, если выполняется хотя бы одно из следующих условий:

  1. Строка домена и строка идентичны. (Обратите внимание, что оба   строка домена и строка будут канонизированы в   в этом случае строчные буквы.)

  2. Выполнены все следующие условия:

    • Строка домена является суффиксом строки.

    • Последний символ строки, который не включен в  Строка домена представляет собой символ% x2E (".").

    • Строка - это имя хоста (т.е. не IP-адрес).

Таким образом, домен "subdomain.mydomain.com" соответствует "mydomain.com", но "mydomain.com" НЕ соответствует домену "subdomain.mydomain.com"

Проверьте этот ответ также.

Ответ 6

Простое решение

setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM);

Параметр Setcookie 5th определяет (под) домены, к которым доступен файл cookie. Установка его на (EXAMPLE.COM) делает его доступным для любого субдомена (например: SUBDOMAIN.EXAMPLE.COM)

Ссылка: http://php.net/manual/en/function.setcookie.php