web-dev-qa-db-de.com

wie lösche ich alle Cookies meiner Website in PHP?

Ich frage mich, ob ich alle Cookies meiner Website löschen kann, wenn ein Benutzer auf "Abmelden" klickt, weil ich diese Funktion zum Löschen von Cookies verwendet habe, aber es funktioniert nicht richtig:

setcookie("user",false);

Gibt es eine Möglichkeit, die Cookies einer Domäne in PHP zu löschen?

85
Mac Taylor

PHP setcookie ()

Von dieser Seite genommen, werden alle Cookies für Ihre Domain gelöscht:

// 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/de/function.setcookie.php#73484

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

Noch besser ist es jedoch, sich zu merken (oder irgendwo zu speichern), welche Cookies in Ihrer Anwendung auf einer Domain gesetzt sind und diese direkt zu löschen.
Auf diese Weise können Sie sicher sein, alle Werte korrekt zu löschen.

41
poke

Ich stimme mit einigen der obigen Antworten überein. Ich würde nur empfehlen, "time () - 1000" durch "1" zu ersetzen. Ein Wert von "1" bedeutet den 1. Januar 1970, wodurch der Ablauf zu 100% sichergestellt wird. Deshalb:

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

stellen Sie sicher, dass Sie Ihre setcookie-Funktion aufrufen, bevor eine Ausgabe auf Ihrer Site erfolgt.

wenn sich Ihre Benutzer abmelden, sollten Sie auch ihre Sitzungsvariablen löschen bzw. für ungültig erklären.

3
knittl

Wenn Sie den Namen Ihrer Cookies ändern, möchten Sie möglicherweise auch alle Cookies löschen, aber einen behalten:

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, '/');
        }
    }
}

Auch basierend auf dieser PHP-Answer

2
Roman Holzner

Ich weiß, dass diese Frage alt ist, aber dies ist eine viel einfachere Alternative:

header_remove();

Aber sei vorsichtig! Es löscht ALLE Header, einschließlich Cookies, Session usw., wie in the docs beschrieben.

2
Borjão

Die zur Verfügung gestellten Antworten haben mein Problem nicht gelöst.

Es hat nicht:

  1. Entfernen Sie übergeordnete Domain-Cookies (von a.b.c; entfernen Sie b.c; Cookies).
  2. Entfernen Sie Cookies von einem höheren Pfad als root.

Mein Skript tut es.

<?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, '.')));
    }
}

Es ist nicht die schönste/sicherste/optimale Lösung. Verwenden Sie diese also nur, wenn Sie den Cookie-Pfad und/oder die Cookie-Domain nicht kennen. Oder nutzen Sie die Idee, um Ihre Version zu erstellen.

2

Sie sollten sich der verschiedenen Tracking-Tools wie Google Analytics bewusst sein, die ebenfalls Cookies in Ihrer Domain verwenden, und Sie möchten sie nicht löschen, wenn Sie korrekte Daten in GA erhalten möchten.

Die einzige Lösung, die ich zum Laufen bringen konnte, bestand darin, die vorhandenen Cookies auf null zu setzen. Ich konnte die Cookies nicht vom Client löschen.

Zum Abmelden eines Benutzers verwende ich Folgendes:

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

Natürlich werden dadurch nicht ALLE Cookies gelöscht.

1
Martin LeBlanc

Verwenden Sie die Funktion, um Cookies zu löschen:

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, '/');
    }
}

Wenn Sie true übergeben, werden session-Daten gelöscht. Andernfalls werden Sitzungsdaten beibehalten.

0
Dan Bray

Alle vorherigen Antworten haben übersehen, dass die setcookie mit einer expliziten Domäne hätte verwendet werden können. Ferner könnte der Cookie auf eine höhere Subdomäne gesetzt worden sein, z. Wenn Sie sich in einer foo.bar.tar.com-Domäne befanden, ist möglicherweise ein Cookie in tar.com gesetzt. Daher möchten Sie Cookies für alle Domains aufheben, die möglicherweise den Cookie gelöscht haben:

$Host = explode('.', $_SERVER['HTTP_Host']);

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

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

    array_shift($Host);
}
0
Gajus