PHP - почему я не могу избавиться от этого cookie сессионного идентификатора? - PullRequest
15 голосов
/ 21 октября 2010

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

  • Вы щелкаете ссылку, которая отправляет вас на страницу выхода из системы
  • Страница выхода из системы запускает функцию, которая вызывает session_destroy(), а также проходит через всефайлы cookie для домена и срок их действия истекает в прошлом (см. код ниже)
  • Затем страница выхода перенаправляется на страницу входа, которая является прямым HTML.

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

Что такоеМне здесь не хватает?

Вот функция выхода из системы, о которой я упоминал выше:

function log_out_current_user() {

        // Destroy the session
        if (isset($_SESSION)) {
            session_destroy();
        }

        // Expire all of the user's cookies for this domain:
        // give them a blank value and set them to expire
        // in the past
        if (isset($_SERVER['HTTP_COOKIE'])) {
            $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
            foreach($cookies as $cookie) {
                $parts = explode('=', $cookie);
                $name = trim($parts[0]);
                setcookie($name, '', time()-1000);
                setcookie($name, '', time()-1000, '/');
            }
            // Explicitly unset this cookie - shouldn't be redundant,
            // but it doesn't hurt to try
            setcookie('PHPSESSID', '', time()-1000);
        }

    }

1 Ответ

31 голосов
/ 21 октября 2010

Вы не удаляете его с такими же параметрами, как он был создан.Используйте session_get_cookie_params для их получения.Чтобы быть переносимым, вы должны получить имя файла cookie через session_name.Вот небольшой скрипт для этого:

$params = session_get_cookie_params();
setcookie(session_name(), '', 0, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));
...