Подтвердить что ты не робот

IE10 передает файлы cookie по субдоменам по умолчанию

IE10, похоже, обрабатывает файлы cookie и субдомены по-другому, чем другие основные браузеры (IE8, IE9, Firefox, Chrome, Safari).

Мы широко используем субдомены для тестовых сред, например:

  • user1.devel.example.com
  • user2.devel.example.com
  • qa.example.com

И наша производственная среда находится наверху, например. example.com(и технически также на www.example.com).

Мы используем функцию php setcookie($name, $value, $expires) наивно (не указывается явный путь или домен), чтобы установить cookie, а затем очистить файлы cookie (когда пользователь выходит из системы), назначив пустую строку значению. Это всегда срабатывало нормально, и каждый уникальный субдомен использовал свои собственные файлы cookie.

IE10 теперь "разделяет" cookie, который был установлен в TLD со всеми подобластями. Первоначальный симптом, который мы наблюдали, заключался в том, что никто не мог выйти из поддомена. Мы заметили несколько вещей:

  • Несмотря на то, что он имеет значение, ни один поддомен не может очистить файл cookie.
  • Когда TLD очищает файл cookie, он сразу же удаляется из всех поддоменов.

Кто-нибудь еще наблюдал подобное поведение по тому, как IE10 хранит/применяет файлы cookie относительно поддоменов? Существует ли какое-либо обходное решение, отличное от того, в каком домене применяется cookie при отправке исходного заголовка Set-Cookie?

4b9b3361

Ответ 1

Я только что столкнулся с этой проблемой.

Вот ссылка на кого-то, изучающего эту ошибку/проблему: Файлы cookie с указанным доменом и без него (несовместимость браузера)

Это также может быть связано: Набор файлов cookie для субдомена, но IE Developer Tools показывает cookie в корневом домене. Что мне не хватает?

Мое заключение заключается в том, что при настройке файла cookie из корневого домена, отличного от www (http://sites.com), в IE это рассматривается как подстановочный файл cookie для всех поддоменов. Chrome и Firefox не показывают этого поведения - они связывают набор cookie из корневого домена, отличного от www, как связанного только с этим корнем.

Я закодировал примеры сайтов с использованием .net webforms, IIS и моего файла hosts. У меня было 3 сайта: a.site.com, b.site.com и site.com. Все они служили куки с тем же именем. Позвольте называть его "ShoppingCart".

Вы можете установить несколько свойств в файлах cookie, включая домен, к которому должен быть связан cookie. Я оставил это свойство для определения /left undefined по .net. Когда Chrome получил файл cookie с каждого сайта, он отобразил домен куки файла как явно из домена, указанного в адресной строке браузера. В IE это было не так. IE рассматривает cookie от http://sites.com как определяемый как ".sites.com", и согласно RFC для файлов cookie это означает, что он доступен из всех поддоменов.

Также в IE, если несколько файлов cookie установлены с тем же именем, IE возвращает их на сервер в том порядке, в котором они были установлены. Поэтому, если я сначала загляжу в http://sites.com, а затем зайдите на http://a.sites.com, а затем обновить, IE просматривает файл cookie http://sites.com в качестве допустимого файла cookie для отправки на сервер в нем запроса http://a.sites.com, который отправляется вместе с файлом cookie для http://a.sites.com, кроме cookie для http://sites.com является первым в списке.

В .net, из того, что я видел, файлы cookie обычно доступны по имени, а не по индексу. Поэтому, когда код на стороне сервера пытается получить доступ к значению для ключа с именем "ShoppingCart", он будет захватывать значение для первого сайта, который устанавливает значение cookie - здесь это будет http://sites.com.

В заключение - не используйте домены без доменов, когда у вас есть субдомены, которые имеют общие имена файлов cookie, потому что, хотя Chrome/Firefox обрабатывает ассоциацию домена, как и следовало ожидать, IE вызывает ошибочное поведение.

Правка -

Чтобы уточнить, кто читает это, я использовал IE10 для изучения этой проблемы.

Ответ 2

Супер простой способ исправить это, если у вас несколько доменов PHP в домене.

Например, если у вас есть Wordpress на корне (example.com), и у вас есть пользовательское PHP-приложение на субдомене (a.example.com), то либо внутри вашего приложения, либо Wordpress вам нужно установить другое имя SessionName.

Добавьте session_name() до вашего session_start(), который должен дать два отдельных имени сеансу и, следовательно, не столкнуться.

session_name('AppSession');
session_start();

Легко.

Ответ 4

У меня такая же проблема в IE 11.0.9600 для cookie php session: Internet Explorer отправляет файлы cookie домена домена всем своим поддоменам. Чтобы решить эту проблему, я сохраняю имя домена в переменной сеанса:

$_SESSION['URL'] = str_replace('www.', '', $_SERVER['HTTP_HOST']);

Затем для каждого запроса я проверяю переменную сеанса:

if ( str_replace('www.', '', $_SERVER['HTTP_HOST']) !=  $_SESSION['URL']) {
  session_regenerate_id(true);
  $_SESSION = array();
  $_SESSION['URL'] = str_replace('www.', '', $_SERVER['HTTP_HOST']);
}

Затем, когда мы перейдем от корневого домена к поддомену, мы не будем "в" том же сеансе.