如何在 PHP 中取消设置 cookie?

Posted

技术标签:

【中文标题】如何在 PHP 中取消设置 cookie?【英文标题】:how to unset cookie in PHP? 【发布时间】:2012-05-18 14:39:00 【问题描述】:

我需要弄清楚如何取消设置这个 cookie。到目前为止我尝试的一切都失败了。

这是我目前取消设置的方式,但它似乎不起作用。

setcookie("user_id", $user_id, time() - 7200);

我是这样设置的:

setcookie("user_id", $user_id, time() + 7200);

我有一个名为 set_session_from_cookie() 的函数,它检查是否设置了 cookie,如果设置了,它将使用 cookie 启动一个新会话。

问题是当我在我的页面上使用它时,我无法注销。我认为这是因为我无法取消设置会话。

我有这个功能的原因是如果用户想在他们结束会话后被记住,他们可以通过调用 cookie 重新启动会话。

function set_session_from_cookie()

    if (isset($_SESSION['user_id'])) 
        echo '';
     else 
        $_SESSION['user_id']=$_COOKIE['user_id'];
    

退出:

<?php
require'core.php';
session_destroy();

setcookie("user_id", "", time() - 7200);
header('Location:/social_learning/site_pages/starter-template.php');

我使用以下代码设置我的 cookie:

if ($rememberme == "on") 
    $user_id = mysql_result($query_run, 0, 'id');
    setcookie("user_id", $user_id, time() + 7200);
    $_SESSION['user_id'] = $user_id;
    redirect('home_page.php');
 else 
    if ($rememberme == "") 
        echo 'ok';
        $user_id = mysql_result($query_run, 0, 'id');
        echo $user_id;
        $_SESSION['user_id'] = $user_id;
        redirect('home_page.php');
    

如何在不使用我创建的功能的情况下使用保存的 cookie 重新启动会话?由于该功能似乎导致用户无法再注销。

【问题讨论】:

您的 cookie 是否应该是站点范围的? 应该是吗?我怎么知道? 不要使用相对时间来取消设置 cookie。这使得取消设置取决于您用户的时钟是否准确。使用1 的时间,除了那些认为现在是 1970 年的时钟真的坏了的人之外,这将抓住所有人。 如何将其设置为时间 1? 这不安全。 Cookie 可以轻松编辑,在这种情况下,有人可以通过编辑 cookie 以任何用户身份登录。您应该对 cookie 使用某种加密。 【参考方案1】:

将 cookie 的过期日期设置为过去的某个时间(例如,epoch 之后一秒)。

setcookie("yourCookie", "yourValue", 1);

这将导致 cookie 过期。

使用1 代替0,因为0 将cookie 设置为在会话结束时过期。

【讨论】:

1 被认为是过去的时间吗? @arboles 时间以 UNIX 时间戳的形式给出,所以是的,1 是很久以前的 :) 1 是“1 月 1 日,上午 19:70 00:00:01” 更准确地说,它是 1 是“1 月 1 日,19:70 00:00:01 AM UTC”。 :-) 如果 cookie 的域不是默认域,那么您也必须将域作为 setcookie 函数的第四个参数传递,因为通常最好始终设置第三个(路径)和第四个(域) 参数【参考方案2】:

查看 php 手册以获取有关 setcookie 的信息

http://php.net/manual/en/function.setcookie.php

这些注释应该解释这个过程:

bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )

必须使用与设置相同的参数删除 Cookie 和。如果 value 参数是一个空字符串,或者 FALSE,并且所有 其他参数匹配之前对 setcookie 的调用,然后是 cookie 具有指定名称的将从远程客户端中删除。这 通过将值设置为“已删除”和过期在内部实现 时间到过去一年。

因为设置一个值为 FALSE 的 cookie 会尝试删除 cookie,你不应该使用布尔值。相反,使用 0 表示 FALSE 1 表示 TRUE。

【讨论】:

我目前正在这样做,使用与我设置相同的参数来删除。它不工作。【参考方案3】:

您的代码几乎没有安全问题,但是要回答您的问题,要在 php 中取消设置 cookie,您需要做的就是将过期时间设置为过去的某个时间:

setcookie("user_id", "", time()-10, "/");

“loginform.php”不是一个有效的域,这可能是这里的问题。

【讨论】:

如何在本地主机上设置域? 只需像示例中的“/”一样添加一个斜线,就是这样,这意味着此 cookie 可用于您的所有域。【参考方案4】:

在php手册中,你可以通过设置过期日期来删除cookie:

setcookie("key","",time()-3600);

在某些情况下,您应该为参数提供路径和域。

事实上,如果你分配一个空字符串的cookie,它也会被取消设置:

setcookie("key","");

【讨论】:

我知道,我目前正在做这种方法,但它不起作用。【参考方案5】:

解决这个问题的方法是,我需要设置正确的路径来取消设置 cookie,因为我是从最初设置它的不同文件中取消设置的。

我通过在浏览器 cookie 中查找 cookie 找到了我需要使用哪个路径来取消设置,一旦我在浏览器中找到 cookie,该路径就列在 cookie 附近。所以我然后像这样设置cookie的路径:

setcookie("user_id", $user_id, time() - 1, "/social_learning/site_pages");

最后一个参数是路径。它奏效了。

我原来的setcookie 是这样的:

setcookie("user_id", $user_id, time() + 7200, "");

【讨论】:

这就是答案。我喜欢一个更受欢迎的答案如何没有考虑到你确实将它设置为负时间并且它没有取消。这个答案更适合这个问题。谢谢。【参考方案6】:

使用此代码

  setcookie("CookieName", "", time()-(60*60*24), "/");

在每个网站上每次都为我工作

【讨论】:

是的。这意味着将时间从当前时间设置为“昨天”。

以上是关于如何在 PHP 中取消设置 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

在从 php 会话注销期间取消设置 cookie 有啥意义?

PHP无法取消设置cookie [重复]

创建未设置的 cookie 按钮

浏览器关闭时如何删除或取消设置cookie?

如何使用JavaScript设置/取消设置cookie

如何使用JavaScript设置/取消设置cookie