session_regenerate_id () не работает в IE11 / Edge

У меня есть стандартная ситуация аутентификации … Посетитель заполняет логин + пароль для формирования, php-скрипт аутентифицирует его в базе данных, перенаправляет обратно на какую-то страницу.

В этом процессе мы просто добавляем session_regenerate_id (true), когда клиент успешно аутентифицируется непосредственно перед перенаправлением. Все отлично работает в Chrome, но оно не работает в некоторых версиях (не всех) IE11 и последней версии Edge (в виртуальной коробке – в download.exe). Возможно, это не работает в некоторых других браузерах.

Как это работает в Chrome:

  • страница загрузки клиента с формой входа – он имеет идентификатор сеанса AAA
  • клиент отправляет форму – запрос имеет идентификатор сеанса AAA
  • клиент аутентифицируется – session_regenerate_id (true), вызываемый
  • ответ имеет Set-cookie и идентификатор сеанса BBB (+ местоположение: YYY)
  • браузер запрашивает YYY с идентификатором сессии BBB
  • ответ не имеет set-cookie, поэтому идентификатор сеанса – BBB
  • клиент аутентифицирован

Как это работает в IE11 / Edge:

  • страница загрузки клиента с формой входа – он имеет идентификатор сеанса AAA
  • клиент отправляет форму – запрос имеет идентификатор сеанса AAA
  • клиент аутентифицируется – session_regenerate_id (true), вызываемый
  • ответ имеет Set-cookie и идентификатор сеанса BBB (+ местоположение: YYY)
  • браузер запрашивает YYY с идентификатором сессии AAA
  • в ответе нет set-cookie, поэтому идентификатор сеанса – AAA
  • клиент НЕ аутентифицирован

Проблема в том, что сеанс AAA удаляется при восстановлении идентификатора сеанса, поэтому клиент не может быть аутентифицирован.

Он даже не работает, когда нет заголовка местоположения и просто отображается статическая страница со ссылкой на другую страницу.

Похоже, браузер игнорирует Set-cookie.

Когда я удаляю session_regenerate_id (), он «работает», бутон становится менее безопасным.

Я сам отвечаю на свой вопрос … Проблема в том, что заголовок Set-cookie не содержит домена.

Пример: http://www.site.com

Chrome: работает нормально, получает домен с текущего URL (www.site.com). Edge: не знаю, как, но новый идентификатор сеанса сохраняется на домен site.com

Решение: используйте session_set_cookie_params (), чтобы установить домен на «.site.com» (все поддомены).