当httponly为true时,Cookie会阻止setcookie()删除

时间:2015-01-16 10:57:21

标签: php cookies httponly

我使用cookies来实现“记住我”选项,以便在我的网站上登录。设置cookie工作正常。取消设置曾经工作过。然后我用httponly cookies创建了一个新版本的网站; logout在localhost上工作,但它在服务器上不起作用。我在目录“test”中运行新代码;我仍然可以使用旧代码,它可以很好地运行旧登录功能中设置的cookie(而不是新功能)。

以防万一可能很重要,并证明我没有解决related questions uncorrect parameterstesting on the same pageheaders already sentHTTP Spy的答案中的任何问题。在取消设置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'); 
  }

我测试了标题 - 它们运行正常。响应标头(根据Chrome的a similar question扩展名)包括以下内容:

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之前删除旧cookie并注意不要使它们不匹配。无论如何,httponly似乎没有什么区别。

  

我发现its answer说取消了   没有服务器交互,就无法使用httponly cookie。   从理论上讲,它应该不是问题,因为我使用的是php,它有效   服务器端。但是,在实践中并不容易。但是有一个   解决方案,在{{3}}中建议:制作其中一个Cookie   与另一个没有httponly属性。我害怕有   密码cookie中的旧值将与登录冲突   另一个用户,但我测试了它,它工作正常,新用户的   密码只会覆盖旧用户的密码。

1 个答案:

答案 0 :(得分:0)

问题不是在httponly中,甚至在我链接的任何其他问题中都没有,但在域中 - 在&#34; main&#34;域名(e-history.cz)&#34;域名&#34; cookie属性自动以点为前缀。在test子目录(e-history.cz/test)上,这并没有发生。结果是我可以删除主域生成的cookie,即使测试域使用httponly cookie,但我无法从test subdir中删除cookie。我明确地将点添加到域中,现在一切正常。对主域和测试域使用相同的cookie现在似乎不是问题 - 如果它是一个问题,我会完全删除点(通过设置null或&#39;&#39;来调用默认值,而不是集合域)。