Файлы cookie сопротивляются удалению setcookie (), если httponly имеет значение true

Я использую файлы cookie, чтобы реализовать опцию «запомнить меня» для входа в мой веб-сайт. Настройка cookie работает нормально. Сбросить раньше работало. Затем я сделал новую версию сайта с httponly cookies; выход из системы работал на 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-файлами; каждый раз, когда я удалял старые файлы cookie, прежде чем создавать новые, и старался их не перепутать. В любом случае, httponly, похоже, не имеет значения.

Я нашел аналогичный вопрос, в котором говорится, что отключение httponly cookie невозможно без взаимодействия с сервером. Теоретически это не должно быть проблемой, так как я использую php, который работает на стороне сервера. Однако на практике это не так просто. Но есть решение, предложенное в его ответе: сделать один из файлов cookie со свойством httponly, а другой - без свойства. Я боялся, что старое значение в файле cookie пароля может конфликтовать с логином от имени другого пользователя, но я протестировал его, и он работает нормально, пароль нового пользователя просто перезаписывает пароль старого пользователя.


person Pavel V.    schedule 16.01.2015    source источник


Ответы (1)


Проблема была не в httponly и даже не в какой-либо другой проблеме, которую я связал, а в домене - в «основном» домене (e-history.cz) свойство cookie «domain» автоматически префикс точки. В подкаталоге test (e-history.cz/test) этого не произошло. В результате я мог удалить файлы cookie, создаваемые основным доменом, даже если тестовый домен работал с файлами cookie httponly, но я не мог удалить файлы cookie из тестового подкаталога. Я добавил точку в домен явно, и теперь все работает нормально. Использование одних и тех же файлов cookie для основного и тестового доменов, похоже, сейчас не проблема - если бы это было проблемой, я бы полностью удалил точку (установив null или '' для вызова значения по умолчанию вместо заданного домена).

person Pavel V.    schedule 19.01.2015