PHP Регенерация идентификатора сеанса при входе/выходе не работает

У меня возникли проблемы с работой session_regenerate_id() PHP в приложении Я развиваюсь. Приложение использует самодельную инфраструктуру MVC (свободную) и перенаправляет все запросы, используя .htaccess, через файл index.php.

Я пытаюсь восстановить идентификатор сеанса при выходе из системы, но он работает неправильно.

Вот некоторый код из моего контроллера выхода — переменная expired — это проверка тайм-аута сеанса:

    session_regenerate_id(true);        
    if(isset($_SESSION['expired']))
    {
        $this->registry->template->expired = true;
    }

    session_unset();
    session_destroy();

Также актуален код из начала файла index.php:

    session_cache_expire(20);
    session_start();
    session_name("TMU");
    //session_regenerate_id();

Я повторяю результат session_id() внизу каждой страницы, чтобы увидеть, что он содержит, чтобы проверить, был ли он регенерирован.

Однако идентификатор сеанса не меняется при выходе из системы. Когда вы снова входите в систему (даже с другой учетной записью), идентификатор сеанса остается прежним.

Вы заметите закомментированную четвертую строку файла index.php — если я раскомментирую эту строку, ID будет регенерироваться на каждой странице, как и должно быть. Однако, когда я снова комментирую строку, идентификатор сеанса снова становится исходным идентификатором до того, как я раскомментировал строку в индексном файле...

Мне просто интересно, как я могу заставить session_regenerate_id() работать. Кажется, что он просто не «фиксирует» измененный идентификатор. Я пытался использовать session_commit(), но я не понимаю, как это работает полностью, и это выдавало мне ошибку, когда я пытался уничтожить сеанс.

PHP 5.3.10 и апач 2.2.21


person Austen Cameron    schedule 04.04.2012    source источник


Ответы (1)


Пересматривая эту тему несколько раз, я понял это. Было две проблемы.

  1. session_regenerate_id() необходимо вызывать перед отображением любого вывода HTML и/или отправкой заголовков. (Его нужно вызывать одной из первых функций, как и session_start()).
  2. Порядок имеет значение. session_name("TMU") нужно вызывать ДО session_start(), чтобы получить желаемый результат - я не уловил этого раньше.

По сути, то, что происходило со мной, вызывало session_name("TMU") после того, как session_start() заставляло его устанавливать ДВА файла cookie с идентификатором сеанса - два сеанса - один с именем TMU, а другой - просто PHPSESSID по умолчанию. Изменение порядка устранило все мои проблемы, и теперь восстановление идентификатора/удаление старого сеанса работает, как и ожидалось.

Для тех, у кого есть проблемы с этим, я предлагаю вам вывести массивы $_SESSION и $_COOKIE, чтобы увидеть, что происходит в вашем конкретном приложении.

person Austen Cameron    schedule 19.04.2012