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).

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

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

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

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

Solutions Collecting From Web of "IE10 передает файлы cookie по субдоменам по умолчанию"

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

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

Это также может быть связано с: 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. Я оставил это свойство неопределенным / 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 .

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

Редактировать–

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

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

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

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

 session_name('AppSession'); session_start(); 

Легко.

Да, это известные проблемы, кажется, читайте здесь: http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx

Они ссылаются на этот тест: http://debugtheweb.com/test/cookieinherit.aspx и http://www.debugtheweb.com/test/cookieinherit.aspx

У меня такая же проблема в 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']); } 

Затем, когда мы переходим из корневого домена в поддомен, мы не будем «в» в том же сеансе.