Cookies сопротивляются удалению setcookie(), когда httponly имеет значение true
Я использую куки, чтобы реализовать опцию "запомнить меня" для входа в мою сеть. Настройка cookie работает нормально. Отключение используется для работы. Затем я сделал новую версию сайта с использованием файлов cookie httponly; logout работал на localhost, но не работает на сервере. Я запускаю новый код в каталоге "test"; Я все еще могу использовать старый код, который хорошо работает для файлов cookie, установленных в старой функции входа в систему (но не в новой).
На случай, если это может быть важно, и чтобы доказать, что у меня нет общих проблем, решаемых в ответах на связанные вопросы, такие как неверные параметры, тестирование на той же странице, заголовки уже отправлены или относительное время при удалении файлов cookie, я показываю свои коды, Во-первых, код, устанавливающий файлы cookie (новые):
...
setcookie ('login', $login, time()+60*60*24*30,'/','e-history.cz', false, true);
setcookie ('pass', $pass, time()+60*60*24*30,'/','e-history.cz', false, true);
...
Мой скрипт выхода из системы:
<?php
include 'login_functions.php';
logout();
?>
И функция выхода из системы:
function logout() {
include 'library.php'; //all functions and constants
//var_dump( headers_sent() ); //I've tested the headers, not sent yet
checkSession(); //starts session if not started
unset($_SESSION['login']); //I don't need to delete the rest of the session for logout
if(isset($_COOKIE['login'])) {
setcookie ('login', '', 1,'/','e-history.cz', false, true);
}
if(isset($_COOKIE['pass'])) {
setcookie ('pass', '', 1,'/','e-history.cz', false, true);
}
header('Location:index.php');
}
Я проверил заголовки - они работают хорошо. Заголовки ответа (согласно расширению HTTP Spy для Chrome) включают следующее:
Set-Cookie pass=deleted;
expires=Thu, 01-Jan-1970 00:00:01 GMT;
path=/;
domain=e-history.cz;
httponly
Set-Cookie login=deleted;
expires=Thu, 01-Jan-1970 00:00:01 GMT;
path=/;
domain=e-history.cz;
httponly
РЕДАКТИРОВАТЬ - я делаю свой прежний "ответ" частью вопроса, потому что это работало только в течение некоторого времени; Я не знаю, почему это не работает сейчас. Я переключался несколько раз между не-httponly, httponly и смешанными файлами cookie; Каждый раз, когда я удалял старые куки, прежде чем создавать новые, старался не нарушать их. Во всяком случае, httponly, кажется, не имеет значения.
Я обнаружил аналогичный вопрос о том, что отключение файла cookie httponly невозможно без взаимодействия с сервером. Теоретически, это не должно быть проблемой, так как я использую php, который работает на стороне сервера. Однако на практике это не так просто. Но есть решение, предложенное в его ответе: сделать один из файлов cookie с другим, а не свойство httponly. Я боялся, что наличие старого значения в файле cookie пароля может вступить в конфликт с именем входа другого пользователя, но я проверил его, и он работает нормально, пароль нового пользователя просто перезаписывает пароль старого пользователя.
1 ответ
Проблема была не в httponly, и даже не в какой-либо другой проблеме, которую я связал, а в домене - в "главном" домене (e-history.cz) свойство cookie "домен" автоматически начинается с точки. В подкаталоге test (e-history.cz/test) этого не произошло. В результате я мог удалить файлы cookie, созданные основным доменом, даже если тестовый домен работал с файлами cookie httponly, но я не смог удалить файлы cookie из тестового подкаталога. Я добавил точку в домен явно, и теперь все работает нормально. Использование одинаковых файлов cookie для основного и тестового доменов теперь, по-видимому, не является проблемой - если бы это было проблемой, я бы полностью удалил точку (установив значение null или '' для вызова значения по умолчанию вместо установленного домена).