Обмен cookie между поддоменом и доменом

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

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

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

9 ответов

Решение

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

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

Set-Cookie: name=value

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

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

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

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

В итоге, если вы установите cookie, как во втором примере выше, mydomain.comбыло бы доступно subdomain.mydomain.com, и наоборот.

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

Обратите внимание на то, что вы можете установить 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 Сопоставление доменов

Соответствие доменов

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

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

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

    • Строка домена - это суффикс строки.

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

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

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

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

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

Если атрибуты 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 / для тех, кто пропустил его в своем ответе, как я; стоит прокрутить вверх и вверх /:

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

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

document.cookie = "ключ = значение"

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

document.cookie = "ключ = значение; домен =mydomain.com"

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


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

document.cookie = "ключ = значение; домен =.mydomain.com"

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


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

document.cookie = "ключ = значение; домен =.mydomain.com"

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

Будьте осторожны, если вы работаете на localhost! Если вы храните свой cookie в js следующим образом:

document.cookie = "key=value;domain=localhost"

Он может быть недоступен для вашего поддомена, например sub.localhost. Чтобы решить эту проблему, вам необходимо использовать Virtual Host. Например, вы можете настроить свой виртуальный хост с помощьюServerName localhost.com тогда вы сможете хранить свой файл cookie в своем домене и субдомене следующим образом:

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

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

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

я делаю это и это работает для меня

      Cookie.set('token', 'some jwt-token', { expire:50000, domain: 'mydomain.com' })

На самом деле, в моем случае я хотел поделиться данными cookie между test.ir и sd.test.ir домен и поддомен, для удобной работы с cookie в браузере я использовал js-cookieа для обмена я имитирую решение Facebook :

      Cookie.set('key', 'value', { domain: '.facebook.com' })

// adding a . before domain name

Установив, как указано выше, вы можете получить доступ к данным cookie в базовом домене и поддоменах.

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

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

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

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

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