web-dev-qa-db-fra.com

comment supprimer tous les cookies de mon site web en php

Je me demande si je peux supprimer tous les cookies de mon site Web lorsqu'un utilisateur clique sur se déconnecter, car je l'utilisais comme fonction pour supprimer les cookies, mais cela ne fonctionnait pas correctement:

setcookie("user",false);

Est-il possible de supprimer les cookies d'un domaine en PHP?

85
Mac Taylor

PHP setcookie ()

Tiré de cette page, tous les cookies de votre domaine seront supprimés:

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

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

Il est toutefois préférable de mémoriser (ou de le stocker quelque part) les cookies configurés avec votre application sur un domaine et de les supprimer tous directement.
De cette façon, vous pouvez être sûr de supprimer toutes les valeurs correctement.

41
poke

Je suis d'accord avec certaines des réponses ci-dessus. Je recommanderais simplement de remplacer "time () - 1000" par "1". Une valeur de "1" signifie le 1er janvier 1970, ce qui garantit une expiration à 100%. Donc:

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

assurez-vous d'appeler votre fonction setcookie avant toute sortie sur votre site.

de plus, si vos utilisateurs se déconnectent, vous devez également supprimer/invalider leurs variables de session.

3
knittl

Lorsque vous modifiez le nom de vos cookies, vous pouvez également supprimer tous les cookies mais en conserver un:

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

Aussi basé sur ceci PHP-Answer

2
Roman Holzner

Je sais que cette question est ancienne, mais c'est une alternative beaucoup plus facile:

header_remove();

Mais fais attention! Il effacera TOUS les en-têtes, y compris les cookies, les sessions, etc., comme expliqué dans la documentation .

2
Borjão

Les réponses fournies n'ont pas résolu mon problème,

Il n'a pas:

  1. Supprimer les cookies du domaine parent (de a.b.c; remove b.c; cookies),
  2. Supprimez les cookies d'un chemin plus élevé que la racine.

Mon script fait, voir.

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

Ce n'est pas la solution la plus jolie/sûre/optimale, utilisez-la uniquement si vous ne connaissez pas le cookie-path et/ou le cookie-domain. Ou utilisez cette idée pour créer votre version.

2
Wesley Abbenhuis

Vous devez savoir que divers outils de suivi, tels que Google Analytics, utilisent également des cookies sur votre domaine et vous ne souhaitez pas les supprimer, si vous souhaitez que les données soient correctes dans GA.

La seule solution que je pouvais utiliser consistait à définir les cookies existants sur null. Je ne pouvais pas supprimer les cookies du client.

Donc, pour déconnecter un utilisateur, j'utilise les éléments suivants:

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

Bien sûr, cela ne supprime pas TOUS les cookies.

1
Martin LeBlanc

Utilisez la fonction pour effacer les cookies:

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

Si vous passez true, les données session sont effacées, sinon les données de session sont préservées.

0
Dan Bray

Toutes les réponses précédentes ont oublié que la variable setcookie aurait pu être utilisée avec un domaine explicite. En outre, le cookie pourrait avoir été défini sur un sous-domaine plus élevé, par exemple. si vous étiez sur un domaine foo.bar.tar.com, un cookie pourrait être défini sur tar.com. Par conséquent, vous souhaitez désactiver les cookies pour tous les domaines susceptibles d'avoir abandonné le cookie:

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

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

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

    array_shift($Host);
}
0
Gajus