Хорошо, я в тупике, и часами смотрю на это.
Я устанавливаю файл cookie на /access/login.php со следующим кодом:
setcookie('username', $username, time() + 604800, '/');
Когда я пытаюсь выйти из системы, которая находится по адресу /access/logout.php (и переписана в / access / logout), файл cookie, похоже, не будет отменен. Я пробовал следующее:
setcookie('username', false, time()-3600, '/'); setcookie('username', '', time()-3600, '/'); setcookie('username', '', 1, '/');
Я также пытался напрямую нажать /access/logout.php, но он не работает.
Ничего не отображается в журналах php.
Какие-либо предложения? Я не уверен, что я что-то упустил, или что происходит, но настало время смотреть на этот код и пытаться отлаживать.
Как вы определяете, если он не установлен? Имейте в виду, что setcookie () не удалит его из суперкоммулята $ _COOKIE текущего скрипта, поэтому, если вы вызываете setcookie (), чтобы отменить его, а затем сразу print_r($_COOKIE);
, он будет отображаться до тех пор, пока вы не обновите страницу.
Попробуйте вставить javascript:alert(document.cookie);
в вашем браузере, чтобы убедиться, что вы не сохранили несколько файлов cookie. Очистите все файлы cookie для домена, над которым вы работаете, чтобы убедиться, что вы начинаете новый. Также ini_set(E_ALL);
чтобы вы не пропускали никаких уведомлений.
Кажется, это проблема с сервером. Мой последний домен был довольно расслаблен при обработке ошибок PHP, в то время как новый домен показывает каждую ошибку. Я использую оба сайта бок о бок, а старый удаляет куки-файлы так, как должен.
Возможно, существует проблема с часовым поясом? Вы пытались установить что-то более далекое в прошлом, например time() - (3600*24)
? В документации PHP говорится, что внутренняя реализация для удаления файлов cookie использует отметку времени в прошлом году.
Кроме того, вы должны иметь возможность использовать только setcookie('username', false);
без передачи временной метки истечения срока действия, поскольку этот аргумент является необязательным. Может быть, в том числе это как-то путает PHP?
Как вы используете данные cookie в своем приложении?
Если вы прочтете файлы cookie и проверьте, не является ли имя пользователя ложным или нет, значит, установить его значение false или '' будет достаточно, так как ваше приложение будет игнорировать значение cookie.
Лучше поместите некоторую защиту в значение cookie, чтобы предотвратить изменение пользователем его значения. Вы можете взглянуть на библиотеку сеансов CodeIgniter, посмотреть, как CI защищает значение cookie с помощью хэша. Будет обнаружено изменение неавторизованного значения, и файлы cookie будут удалены.
Кроме того, CI делает это, чтобы убить файлы cookie:
// Kill the cookie setcookie( $this->cookie_name, addslashes(serialize(array())), (time() - 31500000), $this->cookie_path, $this->cookie_domain, 0 );
Вы также можете удалить файлы cookie из javascript. Проверьте здесь http://www.php.net/manual/en/function.setcookie.php#96599
Простым и удобным способом является использование дополнительных функций:
function getCookie($name) { if (!isset($_COOKIE[$name])) return false; if ($_COOKIE[$name]=='null') $_COOKIE[$name]=false; return $_COOKIE[$name]; } function removeCookie($name) { unset($_COOKIE[$name]); setcookie($name, "null"); }
сfunction getCookie($name) { if (!isset($_COOKIE[$name])) return false; if ($_COOKIE[$name]=='null') $_COOKIE[$name]=false; return $_COOKIE[$name]; } function removeCookie($name) { unset($_COOKIE[$name]); setcookie($name, "null"); }
удаление файла cookie прост:
removeCookie('MyCookie'); .... echo getCookie('MyCookie');
У меня была аналогичная проблема.
Я обнаружил, что по какой-то причине, повторяя что-то из logout.php, он фактически удаляет файл cookie:
echo '{}'; setcookie('username', '', time()-3600, '/');
У меня была такая же проблема; Я выхожу из системы (и я вышел из системы), вручную перезагрузите index.php, а затем снова зашел в систему. Затем, когда я выхожу из системы, я правильно выхожу из системы.
Выход из системы – это простая ссылка (index.php? Task = logout). Задача удаляет пользователя из сеанса и «удаляет» (задает значение «и устанавливает истечение в прошлом) cookie, но index.php будет читать токен пользователя auth из файла cookie сразу после этой (или все) задачи ( как при нормальных операциях). Это перезагрузит пользователя. После загрузки страницы браузер не покажет cookie для токена авторизации. Поэтому я подозреваю, что cookie будет написан после загрузки страницы.
Мое простое решение состояло в том, чтобы не читать cookie, если задача была установлена для выхода из системы.
использовать сеансы для аутентификации, не использовать сырые файлы cookie