如何在php中删除我网站的所有cookie


92

我想知道当用户单击注销时是否可以删除网站的所有cookie,因为我将其用作删除cookie的功能,但无法正常工作:

setcookie("user",false);

有没有一种方法可以在PHP中删除一个域的Cookie?


在大多数情况下,更好的主意是更明智地选择性使用Cookie。如果您使用会话,则一个 cookie就足够了。无论如何,跟踪设置的cookie,然后就不需要动态地遍历它们并删除它们了。
caw

Answers:


172

PHP setcookie()

从该页面获取的信息将取消设置您域的所有cookie:

// unset cookies
if (isset($_SERVER['HTTP_COOKIE'])) {
    $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
    foreach($cookies as $cookie) {
        $parts = explode('=', $cookie);
        $name = trim($parts[0]);
        setcookie($name, '', time()-1000);
        setcookie($name, '', time()-1000, '/');
    }
}

http://www.php.net/manual/zh/function.setcookie.php#73484


9
我读了该评论,但我真的不明白为什么使用该HTTP_COOKIE值比遍历$_COOKIE数组更好。你有什么理由吗?在我看来,解析器仅需要更多(双重)工作。

据我所知,没有什么区别(除了额外的工作)。
jasonbar'2

11
@poke:如果cookie名称使用数组表示法,例如:user [username],则PHP将在$ _COOKIE中自动创建相应的数组。而是使用$ _SERVER ['HTTP_COOKIE'],因为它会镜像实际的HTTP请求标头。
法哈迪

除了cookie或具有设置值的cookie,如何删除所有cookie?
Chill Web Designs

2
我见过这样的情况,其中有两个Cookie的名称相同,但域设置不同。其中一个会将其放入$ _COOKIE数组,而另一个不会。但是它们都将在HTTP_COOKIE中可见。如果您想清理这种情况,这就是解决方法。
dlo 2015年

42
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
    setcookie( $key, $value, $past, '/' );
}

但是,更好的办法是记住(或将其存储在某个域中)与您的应用程序一起设置的cookie,并直接删除所有cookie。
这样,您可以确保正确删除所有值。


2
好的代码,但不足以使用setcookie( $key, FALSE );?!(请参阅php.net/manual/en/function.setcookie.php上的Notes选
Marco Demaio 2011年

@Marco Demaio:应该的,但是我已经看到过去在某些服务器上失败了。但是,当然,如果它对您

这不应该是服务器问题,它是由PHP在内部完成的。/您需要放入决赛setcookie吗?
Marco Demaio 2011年

@Marco Demaio:是的,对于服务器,我指的是php服务器。该/是Cookie路径。您需要对其进行设置,以便可以从域中删除cookie,否则它将被设置为当前路径,并且只会影响为当前路径设置的cookie。

@trante呵!?$ key不是数组,而是一个键。

16

我同意上述一些答案。我只建议将“ time()-1000”替换为“ 1”。值“ 1”表示1970年1月1日,它确保有效期为100%。因此:

setcookie($name, '', 1);
setcookie($name, '', 1, '/');

1
我一直想知道为什么没有人说要这样做,这是我一直在寻找的答案。
2013年

当前可能不是问题,但是在某些时候,某些浏览器忽略了一个都旧了的日期,并且这些值不会像应有的那样被丢弃。我相信IE 7是做到这一点的一个例子。
conrad10781

3

确保在站点上发生任何输出之前调用setcookie函数。

同样,如果您的用户要注销,则还应该删除/使他们的会话变量无效。


2

当您更改Cookie的名称时,您可能还希望删除所有Cookie,但保留其中一个:

if (isset($_COOKIE)) {
    foreach($_COOKIE as $name => $value) {
        if ($name != "preservecookie") // Name of the cookie you want to preserve 
        {
            setcookie($name, '', 1); // Better use 1 to avoid time problems, like timezones
            setcookie($name, '', 1, '/');
        }
    }
}

也基于此PHP-Answer


1
错误的语法:1)if子句中没有AS构造2)用$ _COOKIE替换“ $ cookies”
Jeff

2

提供的答案无法解决我的问题,

它没有:

  1. 删除父域Cookie(从abc;删除bc; cookie),
  2. 从除root以外的更高路径中删除cookie。

我的脚本确实可以看到。

<?php function unset_cookie($name)
{
    $host = $_SERVER['HTTP_HOST'];
    $domain = explode(':', $host)[0];

    $uri = $_SERVER['REQUEST_URI'];
    $uri = rtrim(explode('?', $uri)[0], '/');

    if ($uri && !filter_var('file://' . $uri, FILTER_VALIDATE_URL)) {
        throw new Exception('invalid uri: ' . $uri);
    }

    $parts = explode('/', $uri);

    $cookiePath = '';
    foreach ($parts as $part) {
        $cookiePath = '/'.ltrim($cookiePath.'/'.$part, '//');

        setcookie($name, '', 1, $cookiePath);

        $_domain = $domain;
        do {
            setcookie($name, '', 1, $cookiePath, $_domain);
        } while (strpos($_domain, '.') !== false && $_domain = substr($_domain, 1 + strpos($_domain, '.')));
    }
}

它不是最漂亮/最安全/最佳的解决方案,因此仅在您不知道Cookie路径和/或Cookie域的情况下才使用此解决方案。或使用该构想来创建您的版本。


完美的解决方案
Shakeel Ahmed

1

您应该注意各种跟踪工具,例如Google Analytics(分析)也会在您的域上使用Cookie,并且如果要在GA中获取正确的数据,也不想删除它们。

我唯一可以使用的解决方案是将现有Cookie设置为null。我无法从客户端删除Cookie。

因此,为了注销用户,我使用以下命令:

setcookie("username", null, time()+$this->seconds, "/", $this->domain, 0);
setcookie("password", null, time()+$this->seconds, "/", $this->domain, 0);

当然,这不会删除所有cookie。


7
我不建议将用户密码存储在cookie中。这是一个严重的安全漏洞,尤其是考虑到该0参数意味着cookie在传输过程中甚至没有被加密。
Andrew Ensley

1

以前的所有答案都忽略了setcookie可以用于显式域。此外,该cookie可能已在更高的子域中设置,例如,如果您在foo.bar.tar.com域中,则可能在上设置了cookie tar.com。因此,您要为所有可能已删除Cookie的域取消设置Cookie:

$host = explode('.', $_SERVER['HTTP_HOST']);

while ($host) {
    $domain = '.' . implode('.', $host);

    foreach ($_COOKIE as $name => $value) {
        setcookie($name, '', 1, '/', $domain);
    }

    array_shift($host);
}

0

使用该功能清除Cookie:

function clearCookies($clearSession = false)
{
    $past = time() - 3600;
    if ($clearSession === false)
        $sessionId = session_id();
    foreach ($_COOKIE as $key => $value)
    {
        if ($clearSession !== false || $value !== $sessionId)
            setcookie($key, $value, $past, '/');
    }
}

如果通过,true它将清除session数据,否则将保留会话数据。


0

我知道这个问题很老,但这是一个更容易的选择:

header_remove();

但小心点!它将删除所有标头,包括Cookies,Session等,如docs所述


这实际上并没有做任何实际删除cookie的操作或与该概念类似的任何操作,因为浏览器只会保留所有存储的cookie,直到它们过期为止。尽管这样做确实有帮助,但如果其他事情尝试产生cookie并阻止它们这样做。
My1

0
<?php
      parse_str(http_build_query($_COOKIE),$arr);
      foreach ($arr as $k=>$v) {
        setCookie("$k","",1000,"/");
      }

感谢您提供此代码段,它可能会提供一些有限的即时帮助。通过说明为什么这是一个很好的解决方案,正确的解释将大大提高其长期价值,并使之对其他存在类似问题的读者来说更有用。请编辑您的答案以添加一些解释,包括您所做的假设。
马克西米利安·彼得斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.