come eliminare tutti i cookie del mio sito in php


92

Mi chiedo se posso cancellare tutti i cookie del mio sito web quando un utente fa clic su logout, perché l'ho usato come funzione per eliminare i cookie ma non funziona correttamente:

setcookie("user",false);

C'è un modo per eliminare i cookie di un dominio in PHP?


Nella maggior parte dei casi, l'idea migliore sarà quella di utilizzare i cookie in modo più saggio e selettivo. Se utilizzi le sessioni, un cookie sarà sufficiente. Ad ogni modo, tieni traccia dei cookie che hai impostato, quindi non avrai bisogno di un modo dinamico per scorrere su di essi ed eliminarli.
caw

Risposte:


172

Setcookie PHP ()

Tratto da quella pagina, questo disattiverà tutti i cookie per il tuo dominio:

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


9
Ho letto quel commento, ma davvero non capisco perché usare il HTTP_COOKIEvalore sarebbe meglio che scorrere l' $_COOKIEarray. Hai qualche ragione per questo? A me sembra solo più (doppio) lavoro per il parser.
colpisci il

Non c'è differenza per quanto ne so (tranne il lavoro extra).
jasonbar

11
@poke: se i nomi dei cookie sono nella notazione Array, ad esempio: user [nomeutente] PHP creerà automaticamente un array corrispondente in $ _COOKIE. Utilizza invece $ _SERVER ['HTTP_COOKIE'] poiché rispecchia le intestazioni della richiesta HTTP effettiva.
Farhadi

Come elimineresti tutti i cookie a parte i cookie o i cookie con valori impostati?
Chill Web Designs

2
Ho visto situazioni in cui sono presenti 2 cookie con lo stesso nome, ma con impostazioni di dominio diverse. Uno di loro entrerà nell'array $ _COOKIE e l'altro no. Ma saranno entrambi visibili in HTTP_COOKIE. Se vuoi ripulire questa situazione, questo è il modo per farlo.
dlo

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

Ancora meglio è comunque ricordare (o memorizzarli da qualche parte) quali cookie sono impostati con la tua applicazione su un dominio ed eliminare tutti quelli direttamente.
In questo modo puoi essere sicuro di eliminare tutti i valori correttamente.


2
ottimo codice, ma non è abbastanza da usare setcookie( $key, FALSE );?! (vedi Notes scetion su php.net/manual/en/function.setcookie.php )
Marco Demaio

@Marco Demaio: Dovrebbe esserlo, ma ho visto che fallire in passato su alcuni server. Ma ovviamente, se per te funziona, fallo così :)
colpisci

non dovrebbe essere una questione di server, è il PHP che lo fa internamente. E qual è il bisogno della finale in cui /ti sei piazzato setcookie?
Marco Demaio

@Marco Demaio: Sì, con server intendevo il server php. Il /è il percorso del cookie. È necessario impostarlo in modo da poter rimuovere i cookie dal dominio, altrimenti è impostato sul percorso corrente e influisce solo su quelli impostati per il percorso corrente.
colpisci

@trante Huh !? $ key non è un array, è una chiave.
colpisci il

16

Sono d'accordo con alcune delle risposte precedenti. Consiglio solo di sostituire "time () - 1000" con "1". Un valore "1" indica il 1 ° gennaio 1970, che garantisce una scadenza del 100%. Perciò:

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

1
Mi sono sempre chiesto perché nessuno dice di farlo, ed è una specie di risposta che stavo cercando.
Anther

Forse non è un problema al momento, ma a un certo punto alcuni browser hanno ignorato una data così vecchia tutti insieme, ei valori non sarebbero stati scartati come dovrebbero. Credo che IE 7 sia un esempio che ha fatto questo.
conrad10781

3

assicurati di chiamare la tua funzione setcookie prima che avvenga qualsiasi output sul tuo sito.

inoltre, se i tuoi utenti si disconnettono, dovresti anche eliminare / invalidare le loro variabili di sessione.


2

Quando modifichi il nome dei tuoi cookie, potresti anche voler eliminare tutti i cookie ma conservarne uno:

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

Basato anche su questa risposta PHP


1
Sintassi errata: 1) non c'è un costrutto AS nella clausola if 2) sostituire "$ cookies" con $ _COOKIE
Jeff

2

Le risposte fornite non hanno risolto il mio problema,

Io non l'ho fatto:

  1. Rimuovere i cookie del dominio padre (da abc; rimuovere bc; cookie),
  2. Rimuovere i cookie da un percorso più alto diverso da quello di root.

Il mio copione sì, vedi.

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

Non è la soluzione più carina / sicura / ottimale, quindi usala solo se non conosci il percorso del cookie e / o il dominio dei cookie. Oppure usa l'idea per creare la tua versione.


Soluzione perfetta,
Shakeel Ahmed

1

Dovresti essere a conoscenza che vari strumenti di monitoraggio come Google Analytics utilizzano anche i cookie sul tuo dominio e non vuoi eliminarli, se vuoi avere dati corretti in GA.

L'unica soluzione che ho potuto ottenere è stata impostare i cookie esistenti su null. Non sono riuscito a eliminare i cookie dal client.

Quindi per disconnettere un utente utilizzo quanto segue:

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

Ovviamente questo non cancella TUTTI i cookie.


7
Non consiglierei di memorizzare la password di un utente in un cookie. Questo è un grave buco di sicurezza, soprattutto considerando che l' 0argomento significa che il cookie non è nemmeno crittografato durante il transito.
Andrew Ensley

1

Tutte le risposte precedenti hanno trascurato che setcookieavrebbe potuto essere utilizzato con un dominio esplicito. Inoltre, il cookie potrebbe essere stato impostato su un sottodominio superiore, ad esempio se tu fossi su un foo.bar.tar.comdominio, potrebbe esserci un cookie impostato su tar.com. Pertanto, desideri annullare l'impostazione dei cookie per tutti i domini che potrebbero aver eliminato il cookie:

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

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

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

    array_shift($host);
}

0

Utilizza la funzione per cancellare i 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, '/');
    }
}

Se lo superi true, i sessiondati vengono cancellati , altrimenti i dati della sessione vengono conservati.


0

So che questa domanda è vecchia, ma è un'alternativa molto più semplice:

header_remove();

Ma fa attenzione! Cancellerà TUTTE le intestazioni, inclusi Cookie, Sessione, ecc., Come spiegato nei documenti .


questo non fa nulla per rimuovere effettivamente i cookie o qualcosa di simile a quella nozione poiché il browser conserva solo i cookie memorizzati fino alla loro scadenza. anche se aiuta se altre cose provano a generare i cookie e impedisce loro di farlo.
mio 1

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

Grazie per questo snippet di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Modifica la tua risposta per aggiungere qualche spiegazione, comprese le ipotesi che hai fatto.
Maximilian Peters
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.