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

423

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

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

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

adam0101
источник
3
Да, вы можете .. пожалуйста, смотрите ссылку ниже codeguru.com/csharp/csharp/cs_internet/article.php/c19417/…
Рахул Джайн
Тесно связаны: stackoverflow.com/questions/3089199/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
не могли бы вы посмотреть на этот вопрос stackoverflow.com/questions/38351769/…
Jayavardhan Gange
1
@ adam0101 Что, если домен и поддомен размещены на другом сервере?
user3782114
3
@ user3782114, не имеет значения, если они находятся на разных серверах. В моем случае они были не только на разных серверах, но каждый домен был сбалансирован по нагрузке на несколько серверов. Одна вещь, которая поразила нас, была в том, что нижние среды (dev, test, uat и т. Д.) Тоже начали использовать один и тот же cookie, как только мы это сделали, потому что мы назвали их как «dev.oursite.com», «test». oursite.com "и т. д. Хитрость (по крайней мере, в .Net) заключается в том, чтобы создать отдельный ключ компьютера для каждой среды и сохранить его в файле Web.config (при условии, что вы преобразуете конфигурацию для каждой среды).
adam0101 12.12.16

Ответы:

657

2 домена mydomain.comи subdomain.mydomain.comмогут совместно использовать куки, если домен явно указан в 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.

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

cmbuckley
источник
3
Спасибо; Я добавил примечание о значении точки.
cmbuckley
2
Я не понимаю, почему вы просто не поставили ведущий "." на домене для максимальной совместимости со старым и новым
Алан Макдональд
12
В старом стандарте файл cookie с domain=.mydomain.comнедействительными для голого mydomain.com, поэтому два RFC не совместимы друг с другом.
cmbuckley
4
@ Франк, да, я знаю. Мой комментарий состоял в том, чтобы уточнить, что мой вопрос касался совместного использования файлов cookie между доменом и поддоменом, а НЕ между двумя поддоменами.
adam0101
3
Я не уверен, где это поставить, поэтому я выбираю комментарии принятого ответа. Потребовалось много времени и провалились эксперименты, чтобы доказать вышесказанное на моем локальном хосте, пока мне не пришло в голову, что я должен назвать локальный хост с точкой в ​​имени. Как "localhost.com" или что-то в этом роде. Затем все действия «установить куки» начали следовать объяснениям, приведенным здесь в этом ответе. Надеюсь, что это может помочь кому-то.
Сеск
32

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

akostadinov
источник
4
Похоже, это согласуется с тем, что я говорю: если вы не укажете domain, cookie используется только для хоста запроса. Это означает, что Set-Cookie: name=valuefrom mydomain.comне будет отправлено с запросами к поддоменам. Поиграйте с этим тестовым скриптом тоже.
16:00
@ cmbuckley, хорошо, то, что ты сказал, кажется правильным. Я перефразирую свой ответ. Спасибо за указание на это.
Акостадинов
Необходимо отметить, что раздел 4.1.2 (первая цитата) не является нормативным ...
Вельда
спасибо за ссылку cmbuckley. Приятно проверить, как это работает быстро.
lawphotog
22

Вот пример использования 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 в родительском домене.

llambda
источник
1
Это заставляет меня задуматься, существуют ли отдельные спецификации, описывающие поведение httponlyфайлов cookie и тип файлов cookie, которые вы создаете.
adam0101
3
Размещенные вами документы не согласны с вашими заявлениями. Первые 2 примера не эквивалентны ( domainатрибут заставляет куки работать на поддоменах; ни один такой атрибут не делает). Ведущие точки в лучшем случае игнорируются, а в худшем - активно блокируются.
августа
Это лучшее решение, если вы не хотите полагаться на заголовки хоста. Я проверил это, и он работает
Szymon
14

Пожалуйста, обратите внимание, что вы можете установить 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 соответствует данной доменной строке, если выполняется хотя бы одно из следующих условий:

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

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

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

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

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

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

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

Бухгалтер م
источник
Это был самый полезный ответ для меня.
Тоби
3

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

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

DannyW
источник
0

Будьте осторожны, если вы работаете на localhost! Если вы сохраните свой файл cookie в js, как это:

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

Это может быть недоступно для вашего субдомена, как sub.localhost. Для решения этой проблемы вам нужно использовать виртуальный хост . Например, вы можете настроить свой виртуальный хост, ServerName localhost.comпосле чего вы сможете хранить куки в своем домене и субдомене следующим образом:

document.cookie = "key=value;domain=localhost.com"
Alexandre97122
источник
-12

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

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

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

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

Lawes
источник
18
Этот вопрос не специфичен для PHP, я не думаю, что он считается действительным.
sergelerator
1
Сергелератор, я не ставил вопрос. Я отвечал на ФП.
Lawes
4
@Lawes Я полагаю, что sergelator означает, что вопрос OP не является специфичным для PHP, тогда как ваш ответ, похоже, является решением только для PHP, следовательно, он не подходит для вопроса OP.
Мираж