comment supprimer tous les cookies de mon site Web en php

92

Je me demande si je peux supprimer tous les cookies de mon site Web lorsqu'un utilisateur clique sur la déconnexion, car j'ai utilisé cette fonction pour supprimer les cookies mais cela ne fonctionne pas correctement:

setcookie("user",false);

Existe-t-il un moyen de supprimer les cookies d'un domaine en PHP?

Mac Taylor
la source
Dans la plupart des cas, la meilleure idée sera d'utiliser les cookies de manière plus judicieuse et sélective. Si vous utilisez des sessions, un cookie suffira. Quoi qu'il en soit, suivez les cookies que vous avez définis, vous n'aurez alors pas besoin d'un moyen dynamique de les parcourir et de les supprimer.
caw

Réponses:

172

Setcookie PHP ()

Tiré de cette page, cela supprimera tous les cookies de votre domaine:

// 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

jasonbar
la source
9
J'ai lu ce commentaire, mais je ne comprends vraiment pas pourquoi utiliser la HTTP_COOKIEvaleur serait mieux que de parcourir le $_COOKIEtableau. Avez-vous une raison à cela? Pour moi, cela ne ressemble qu'à plus de (double) travail pour l'analyseur.
poke le
Il n'y a pas de différence pour autant que je sache (sauf le travail supplémentaire).
jasonbar
11
@poke: Si les noms de cookies sont en notation Array, par exemple: user [username] Alors PHP créera automatiquement un tableau correspondant dans $ _COOKIE. Utilisez plutôt $ _SERVER ['HTTP_COOKIE'] car il reflète les en-têtes de requête HTTP réels.
Farhadi
Comment supprimeriez-vous tous les cookies à l'exception des cookies ou des cookies avec des valeurs définies?
Chill Web Designs
2
J'ai vu des situations où il y a 2 cookies avec le même nom, mais avec des paramètres de domaine différents. L'un d'eux sera intégré au tableau $ _COOKIE, et l'autre non. Mais ils seront tous les deux visibles dans HTTP_COOKIE. Si vous voulez nettoyer cette situation, c'est la façon de le faire.
dlo
42
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
    setcookie( $key, $value, $past, '/' );
}

Le mieux est cependant de se souvenir (ou de le stocker quelque part) quels cookies sont définis avec votre application sur un domaine et de les supprimer directement.
De cette façon, vous pouvez être sûr de supprimer toutes les valeurs correctement.

poussée
la source
2
bon code, mais ne suffit pas à utiliser setcookie( $key, FALSE );?! (voir Notes scetion sur php.net/manual/en/function.setcookie.php )
Marco Demaio
@Marco Demaio: Cela devrait l'être, mais j'ai vu cela échouer dans le passé sur certains serveurs. Mais bien sûr, si cela fonctionne pour vous, faites-le comme ça :)
piquez
ce ne devrait pas être une question de serveur, c'est le PHP qui le fait en interne. Et quel est le besoin de la finale dans laquelle /vous vous êtes placé setcookie?
Marco Demaio
@Marco Demaio: Oui, avec le serveur, je voulais dire le serveur php. Le /est le chemin du cookie. Vous devez le configurer pour pouvoir supprimer les cookies du domaine, sinon il est défini sur le chemin actuel et affecte uniquement ceux qui sont définis pour le chemin actuel.
poke
@trante Huh !? $ key n'est pas un tableau, c'est une clé.
poke le
16

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 l'expiration de 100%. Par conséquent:

setcookie($name, '', 1);
setcookie($name, '', 1, '/');
Doug
la source
1
Je me suis toujours demandé pourquoi personne ne dit de faire cela, et c'est un peu la réponse que je cherchais.
Anther
Ce n'est peut-être pas un problème actuellement, mais à un moment donné, certains navigateurs ont ignoré une date aussi ancienne et les valeurs ne seraient pas supprimées comme elles le devraient. Je crois que IE 7 est un exemple qui a fait cela.
conrad10781
3

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.

tricot
la source
2

Lorsque vous modifiez le nom de vos cookies, vous pouvez également vouloir 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, '/');
        }
    }
}

Également basé sur cette réponse PHP

Roman Holzner
la source
1
Syntaxe incorrecte: 1) il n'y a pas de construction AS dans la clause if 2) remplacer "$ cookies" par $ _COOKIE
Jeff
2

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

Il n'a pas:

  1. Supprimer les cookies du domaine parent (de abc; supprimer bc; cookies),
  2. Supprimez les cookies d'un chemin supérieur autre que root.

Mon script le fait, vous voyez.

<?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 / la plus sûre / la plus optimale, alors utilisez-la uniquement si vous ne connaissez pas le chemin du cookie et / ou le domaine du cookie. Ou utilisez l'idée pour créer votre version.

Wesley Abbenhuis
la source
Solution parfaite,
Shakeel Ahmed
1

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

La seule solution que j'ai pu mettre en œuvre était de définir les cookies existants sur null. Je n'ai pas pu supprimer les cookies du client.

Donc, pour déconnecter un utilisateur, j'utilise ce qui suit:

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.

Martin LeBlanc
la source
7
Je ne recommanderais pas de stocker le mot de passe d'un utilisateur dans un cookie. C'est une grave faille de sécurité, d'autant plus que l' 0argument signifie que le cookie n'est même pas chiffré en transit.
Andrew Ensley
1

Toutes les réponses précédentes ont oublié que l ' setcookieaurait pu être utilisé avec un domaine explicite. De plus, le cookie peut avoir été défini sur un sous-domaine supérieur, par exemple si vous étiez sur un foo.bar.tar.comdomaine, il se peut qu'un cookie soit activé tar.com. Par conséquent, vous souhaitez désactiver les cookies pour tous les domaines susceptibles d'avoir déposé le cookie:

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

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

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

    array_shift($host);
}
Gajus
la source
0

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 réussissez, truecela efface les sessiondonnées, sinon les données de session sont conservées.

Dan Bray
la source
0

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

header_remove();

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

Borjovsky
la source
cela ne fait vraiment rien pour supprimer les cookies ou quoi que ce soit de similaire à cette notion, car le navigateur conserve simplement les cookies stockés jusqu'à leur expiration. bien que cela aide si d'autres choses essaient de générer des cookies et les empêche de le faire.
My1
0
<?php
      parse_str(http_build_query($_COOKIE),$arr);
      foreach ($arr as $k=>$v) {
        setCookie("$k","",1000,"/");
      }
Gautam Sharma
la source
Merci pour cet extrait de code, qui pourrait fournir une aide limitée et immédiate. Une explication appropriée améliorerait considérablement sa valeur à long terme en montrant pourquoi c'est une bonne solution au problème et la rendrait plus utile aux futurs lecteurs avec d'autres questions similaires. Veuillez modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez formulées.
Maximilian Peters