Поведение браузера для нескольких файлов cookie с одним и тем же именем / путем - PullRequest
2 голосов
/ 03 ноября 2011

Меня интересует поведение различных браузеров, когда существует несколько файлов cookie с одинаковым именем и путем, которые действительны для текущего домена.Например, браузер сохранил эти два куки:

key=value; path=/; domain=foo.bar.baz
key=value; path=/; domain=bar.baz

Каким будет содержимое заголовка Cookie при посещении пользователем foo.bar.baz?

RFC 2965 есть что сказать о проблеме:

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

(что является ИМО очень странным выбором дизайна, но это то, что мы имеем).Я предполагаю, что серверные инфраструктуры используют первое значение, потому что оно, по крайней мере, иногда более конкретно (я проверил PHP, и это действительно так).

Что я хотел бы знать, так это поведение основных браузеров:какое печенье они отправят первым?(Другими словами, насколько я могу рассчитывать на то, что мое приложение получит «правильное», более конкретное значение?)

1 Ответ

4 голосов
/ 10 ноября 2011

Согласно комментариям выше:

Самая простая защита от этого явно "неопределенного поведения (стандартного)" из моего POV - это не использовать PHPSESSID на основном домене bar.baz, а вместо этого на www.bar.baz - поддомен будет работать нормальнопоскольку в соответствии со стандартом в этом случае нет «запасного варианта», поэтому cookie остается на своем собственном поддомене.

Необходимо проверить одну возможную проблему:

PHP-скрипты, работающие на поддомене, могут быть явно настроены для установки их cookie в основном домене ... Если это так (код выглядит как ini_set('session.cookie_domain', 'bar.baz');), тогда вам нужно изменить эту конфигурацию на "стандарт "(удаляя указанный код), что означает, что сценарий на поддомене должен устанавливать файлы cookie только на свой собственный поддомен.

РЕДАКТИРОВАТЬ - согласно комментариям:

Если у вас нет никакого контроля над каким-либо другим поддоменом, тогда «окончательная защита» заключается в том, чтобы переименовать ваш PHPSESSID cookie в нечто действительно уникальное (например, GUID с PHPSESSID в качестве префикса) либо вызов session_name() ДО session_start() ИЛИ установив его в конфигурации - таким образом вы обойдете всю проблему независимо от поддоменов / версий браузера и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...