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 или '' для вызова значения по умолчанию вместо установленного домена).

Другие вопросы по тегам