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?
Ответы
Ответ 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();
Легко.
Ответ 3
Да, это известные проблемы, которые, кажется, читайте здесь: 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
Ответ 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']);
}
Затем, когда мы перейдем от корневого домена к поддомену, мы не будем "в" том же сеансе.