Usuń plik cookie

260

Kiedy chcę usunąć plik cookie, próbuję

unset($_COOKIE['hello']);

Widzę w przeglądarce plików cookie firmy Firefox, że plik cookie nadal istnieje. Jak mogę naprawdę usunąć plik cookie?

szlifierki
źródło
Może się okazać, $cookie->delete()ze github.com/delight-im/PHP-Cookie pomocny. Kod z pytania po prostu usuwa właściwość, która została przeanalizowana po stronie serwera. Plik cookie będzie nadal dostępny po stronie klienta.
caw

Odpowiedzi:

280

Możesz tego spróbować

if (isset($_COOKIE['remember_user'])) {
    unset($_COOKIE['remember_user']); 
    setcookie('remember_user', null, -1, '/'); 
    return true;
} else {
    return false;
}
Nikunj K.
źródło
141
Rozumiem, że jest to przykład, ale nigdy nie przechowuj nazwy użytkownika ani hasła w plikach cookie.
tamasd
3
To bez sensu unset($_COOKIE['Hello']);. Nic nie zmieni, jeśli go usuniesz.
machineaddict
30
@machineaddict unset($_COOKIE['Hello']);jest naprawdę ważne, jeśli możesz sprawdzić plik cookie gdzieś później w kodzie.
Andreas Hultgren
4
działa dobrze, ale gdy próbuję ponownie załadować stronę. zobaczył zestaw plików cookie ze starymi danymi dlaczego ?.
Nilesh patel
9
======= NIE DZIAŁA W CHROME ======= Wypróbowałem dzisiaj ten kod, a kiedy wchodzę na stronę za pomocą Google Chrome, a następnie wchodzę do narzędzi programistycznych w Chrome, widzę, że wygasa jest ustawiony na 1 sekundę przed epoką (np. 1969-12-31 23:59:59), jednak kiedy następnym razem przesyłam stronę, plik cookie jest przesyłany na serwer. Kiedy zmieniłem wartość -1 na 1 (np. 1970-01-01 00:00:01), aby wydać następującą komendę: setcookie ('Hello', null, 1, '/'); następnie Chrome działał zgodnie z oczekiwaniami i nie przesłał ciasteczka
Peter Hinds
284

Ustaw wartość na „”, a datę wygaśnięcia na wczoraj (lub dowolną datę z przeszłości)

setcookie("hello", "", time()-3600);

Następnie plik cookie wygaśnie przy następnym ładowaniu strony.

Re0sless
źródło
10
Co powiesz na ustawienie czasu na 0 (epoka)? =]
strager
12
Jeśli umieścisz datę zbyt daleko w przeszłości, IE ją zaszczeka i zignoruje, tzn. Wartość nie zostanie usunięta.
Julien
52
@strager W instrukcji podano : Jeśli zostanie ustawiony na 0 lub pominięty, plik cookie wygaśnie pod koniec sesji (po zamknięciu przeglądarki). To tak naprawdę nie usuwa pliku cookie. Naprawdę nie wiem, czy IE zrobi to, co powiedział Julien, ale jest więcej niż możliwe, że IE zrobi coś dziwnego.
yannis
31
Nie zapomnij też zresetować ($ _ COOKIE [„cześć”])), ponieważ jeśli na reszcie strony znajduje się kod, który wygląda na $ _COOKIE [„cześć”], nadal będzie ustawiony. Właśnie mnie to ugryzło.
Magmatic,
12
Ponadto dobrym pomysłem jest ustawienie ścieżki, więc setcookie ('hello', '', time () - 3600, '/');
Stephan Weinhold
226

Prostym sposobem na usunięcie pliku cookie jest wyczyszczenie zarówno $_COOKIEpliku wartości, jak i pliku cookie przeglądarki:

if (isset($_COOKIE['key'])) {
    unset($_COOKIE['key']);
    setcookie('key', '', time() - 3600, '/'); // empty value and old timestamp
}
Mouloud
źródło
3
To najlepsza metoda, ponieważ nie musisz odświeżać strony!
MaxV
19
Ciągle przeglądam stronę, a odpowiedzi stają się coraz lepsze, zabawne. Ale to jest najlepsze, przestań szukać tutaj.
Andrew
23
Do Twojej wiadomości, jeśli ustawisz ciasteczko przy użyciu ścieżki, musisz również dołączyć ścieżkę do tego setcookiewywołania:setcookie('key', '', time() - 3600, '/');
Gavin
1
@Gavin Dzięki za tę wskazówkę. Zastanawiałem się, dlaczego nie zostało usunięte, ale unsettingudało się.
stinkysGTI
1
Dla każdego, kto sprawdza istnienie pliku cookie i dba o pliki cookie, które istnieją z nullwartościami, należy zamiast tego użyć array_key_exists () , ponieważ plik cookie z nullwartością nie zostanie znaleziony przez isset()czek.
Leith,
27

Aby niezawodnie usunąć plik cookie, nie wystarczy ustawić, aby wygasł w dowolnym momencie w przeszłości, zgodnie z obliczeniami serwera PHP. Wynika to z faktu, że komputery klienckie mogą i często mają czasy inne niż czasy twojego serwera.

Najlepszym rozwiązaniem jest, aby zastąpić bieżący plik cookie z pustego pliku cookie, który wygasa jedną sekundę w przyszłości po epoce (1 stycznia 1970 00:00:00 UTC), a więc:

setcookie("hello", "", 1);
Thejoker123
źródło
13
Popraw mnie, jeśli się mylę, ale ustawienie tego na „1” ustawiłoby go na sekundę po epoce, a nie na sekundę w przyszłości ..? Uważam, że masz rację co do różnic stref czasowych, więc najlepszym rozwiązaniem byłoby ustawienie go na 2 dni w przeszłości (tak więc nawet najdalej oddalona strefa czasowa nadal rozbroiłaby ciasteczko).
PaulSkinner
@PaulSkinner data epoki jest niezależna od stref czasowych, komputer wykonuje to obliczenie za Ciebie.
AlexR
3
@AlexR Tak. Ale tak naprawdę nie odpowiada na mój punkt. W moim rozumieniu powyższy kod powoduje, że plik cookie wygasa w przeszłości (jedna sekunda po epoce), chyba że się mylę.
PaulSkinner
@PaulSkinner oczywiście, cała reszta twojego komentarza jest w porządku.
AlexR
9
+1 za „1”. Nie rozumiem, dlaczego wszyscy inni tak bardzo skupiają się na ustawianiu usuniętego pliku cookie dokładnie godzinę wcześniej.
Meisner
20

Spowoduje to rozbrojenie pliku cookie w kodzie, ale ponieważ zmienna $ _COOKIE jest odświeżana przy każdym żądaniu, po prostu wróci do żądania na następnej stronie.

Aby faktycznie pozbyć się ciasteczka, ustaw datę ważności w przeszłości:

// set the expiration date to one hour ago
setcookie("hello", "", time()-3600);
Eric Petroelje
źródło
1
Czy unset()plik cookie nie jest potrzebny ?
Pratik,
2
@PratikCJoshi Tylko jeśli Twój kod będzie go później szukał.
AlphaMycelium
14

Miałem ten sam problem w kodzie i stwierdziłem, że był to problem ze ścieżką pliku cookie. Sprawdź ten post przepełnienia stosu: Nie można usunąć pliku cookie zestawu php

Ustawiłem ciasteczko przy użyciu wartości ścieżki „/”, ale nie miałem żadnej wartości ścieżki, gdy próbowałem go wyczyścić, więc nie wyczyściło się. Oto przykład tego, co zadziałało:

Ustawienie ciasteczka:

$cookiePath = "/";
$cookieExpire = time()+(60*60*24);//one day -> seconds*minutes*hours
setcookie("CookieName",$cookieValue,$cookieExpire,$cookiePath);

Czyszczenie ciasteczka:

setcookie("cookieName","", time()-3600, $cookiePath);
unset ($_COOKIE['cookieName']);

Mam nadzieję, że to pomaga.

użytkownik3285097
źródło
7

Zobacz przykład z etykietą „ Przykład # 2 przykład usuwania setcookie () ” z dokumentacji PHP. Aby usunąć plik cookie z przeglądarki, musisz poinformować przeglądarkę, że plik cookie wygasł ... przeglądarka usunie go. unsetpo jego użyciu po prostu usuwa ciasteczko „hello” z tablicy COOKIE.

Jarret Hardie
źródło
7

Oto jak działa kod setcookie () PHP v7, gdy wykonujesz:

<?php
    setcookie('user_id','');
    setcookie('session','');
?>

Z danych wyjściowych programu tcpdump podczas wąchania portu 80 serwer wysyła do klienta (przeglądarki) następujące nagłówki HTTP:

Set-Cookie: user_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
Set-Cookie: session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0

Obserwując pakiety w następujących żądaniach, przeglądarka nie wysyła już tych plików cookie w nagłówkach

Nulik
źródło
4

Aby usunąć plik cookie, wystarczy ustawić wartość NULL:

„Jeśli ustawiłeś plik cookie z wartościami domyślnymi dla czasu wygaśnięcia, ścieżki lub domeny, musisz podać te same wartości ponownie po usunięciu pliku cookie, aby plik cookie został poprawnie usunięty”. Cytat z książki „Nauka PHP5”.

Więc ten kod powinien działać (działa dla mnie):

Ustawienie ciasteczka: setcookie('foo', 'bar', time() + 60 * 5);

Usuwanie ciasteczka: setcookie('foo', '', time() + 60 * 5);

Zauważyłem jednak, że wszyscy ustawiają datę ważności na przeszłość, czy jest to konieczne i dlaczego?

Boksa
źródło
1
Jest niezawodny, dlatego. Kombinacja ustawienia wartości na nic i czasu w przeszłości (ale nie za daleko, ponieważ IE czasami nie lubi tego zbyt daleko od tego, co przeczytałem) działa ogólnie.
PaulSkinner,
Pusty ciąg ''nie jest tym samym, co null.
orev
3

Aby usunąć wszystkie pliki cookie, możesz napisać:

foreach ($_COOKIE as $key => $value) {
    unset($value);
    setcookie($key, '', time() - 3600);
}
Ralphe Samson
źródło
3
Nie spowoduje to usunięcia plików cookie, chyba że będą miały tę samą ścieżkę i ustawienia domeny, co domyślne ustawienia setcookie.
Noishe
2

Po prostu ustaw datę ważności na godzinę temu, jeśli chcesz „usunąć” plik cookie, w ten sposób:

setcookie ("TestCookie", "", time() - 3600);

lub

setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);

Źródło: http://www.php.net/manual/en/function.setcookie.php

Powinieneś użyć tej filter_input()funkcji dla wszystkich globali, do których użytkownik może wchodzić / manipulować, w następujący sposób:

$visitors_ip = filter_input(INPUT_COOKIE, 'id');

Możesz przeczytać więcej na ten temat tutaj: http://www.php.net/manual/en/function.filter-input.php i tutaj: http://www.w3schools.com/php/func_filter_input.asp

Jo Smo
źródło
2

Wiem, że minęło dużo czasu, odkąd ten temat został stworzony, ale widziałem mały błąd w tym rozwiązaniu (mogę to tak nazwać, ponieważ jest to szczegół). Zgadzam się, że lepszym rozwiązaniem jest prawdopodobnie to rozwiązanie:

if (isset($_COOKIE['remember_user'])) {
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            return true;
        } else {
            return false;
        }

Ale w tym przypadku usuwasz pliki cookie w każdym przypadku, w którym działa funkcja rozbrojenia i natychmiast tworzysz nowe pliki cookie, które wygasły, na wypadek, gdyby funkcja rozbrojenia nie działała.

Oznacza to, że nawet jeśli funkcja nieuzbrojona działa, nadal będzie mieć 2 pliki cookie na komputerze. Zadanym celem, z logicznego punktu widzenia, jest usunięcie plików cookie, jeśli jest to możliwe, a jeśli tak naprawdę nie jest, spowodowanie wygaśnięcia; aby uzyskać „najczystszy” wynik.

Myślę więc, że powinniśmy lepiej:

if (isset($_COOKIE['remember_user'])) {
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            return true;
        } else {
            return false;
        }

Dziękuję i miłego dnia :)

Greg
źródło
Funkcja unset jest przeznaczona dla logiki PHP (jeśli chcesz użyć zmiennej $ _COOKIE ['Hello'], nie możesz, ponieważ jest ona rozbrojona). A funkcja setcookie jest przeznaczona dla nawigatora. 2 różne cele, kolejność funkcji nie ma wpływu na rzeczywisty kod.
Kalzem,
Tak naprawdę, wiem, że tak, ale jeśli absolutnie chcesz mieć pewność, że plik cookie został rozbrojony / usunięty, a więc korzystasz z obu rozwiązań od razu, byłoby lepiej, zanim te wygasną, a następnie rozbroić tezy, niż rozbić tezy i następnie odtwórz wygasłe ciasteczko ... jeśli widzisz, co mam na myśli?
Greg
Tak, przepraszam, odpowiadam właśnie teraz :) Wysłałem to, ponieważ widziałem, jak ludzie robią to w inny sposób ... ale wydaje mi się, że jest to bardziej sprytne, tak myślę.
Greg
2
$cookie_name = "my cookie";
$cookie_value = "my value";
$cookie_new_value = "my new value";

// Create a cookie,
setcookie($cookie_name, $cookie_value , time() + (86400 * 30), "/"); //86400 = 24 hours in seconds

// Get value in a cookie,
$cookie_value = $_COOKIE[$cookie_name];

// Update a cookie,
setcookie($cookie_name, $cookie_new_value , time() + (86400 * 30), "/");

// Delete a cookie,
setcookie($cookie_name, '' , time() - 3600, "/"); //  time() - 3600 means, set the cookie expiration date to the past hour.
Sumudu Sahan Weerasuriya
źródło
2

Jeśli chcesz całkowicie usunąć plik cookie z całej bieżącej domeny, poniższy kod na pewno Ci pomoże.

unset($_COOKIE['hello']);
setcookie("hello", "", time() - 300,"/");

Ten kod całkowicie usunie zmienną cookie z całej domeny, tj. „/” - oznacza wartość tej zmiennej pliku cookie ustawioną dla wszystkich domen, a nie tylko dla bieżącej domeny lub ścieżki. time () - 300 oznacza, że ​​ustawia się na poprzedni czas, więc wygaśnie.

To jest jak idealnie usunięte.

Soumen Pasari
źródło
1

Możesz ustawić zmienną sesji na podstawie wartości plików cookie

session_start();

if(isset($_COOKIE['loggedin']) && ($_COOKIE['loggedin'] == "true") ){
$_SESSION['loggedin'] = "true";
}

echo ($_SESSION['loggedin'] == "true" ? "You are logged in" : "Please Login to continue");
Jason Plank
źródło
1

Możesz po prostu użyć tej funkcji dostosowywania:

function unset_cookie($cookie_name) {
    if (isset($_COOKIE[$cookie_name])) {
        unset($_COOKIE[$cookie_name]);
        setcookie($cookie_name, null, -1);
    } else { return false; }
}

Jeśli chcesz usunąć $ _COOKIE ['user_account'].
Po prostu użyj:

unset_cookie('user_account');
Kenny
źródło
1

To proste!

setcookie("cookiename", "cookievalue", 1);
LF
źródło
Nie ma potrzeby ustawiania wartości usuwanego pliku cookie!
Amir Fo
1

Po wprowadzeniu 0czasu masz na myśli „teraz” (+ 0 od teraz jest teraz) dla przeglądarki i usuwa ciasteczko.

setcookie("key", NULL, 0, "/");

Sprawdziłem to w przeglądarce Chrome, która daje mi:

Name: key
Content: Deleted
Created: Sunday, November 18, 2018 at 2:33:14 PM
Expires: Sunday, November 18, 2018 at 2:33:14 PM
Amir Fo
źródło
Nie. Po prostu przeczytaj dokumenty. „Jeśli zostanie ustawiony na 0 lub pominięty, plik cookie wygaśnie pod koniec sesji (po zamknięciu przeglądarki).”
DrLightman
@DrLightman Dziękujemy za udział, czy możesz przytoczyć dokumentację?
Amir Fo
function.setcookie.php , parametr wygasa . „Jeśli zostanie ustawiony na 0 lub pominięty, plik cookie wygaśnie pod koniec sesji (po zamknięciu przeglądarki).”
DrLightman
1

Wystarczy ustawić wartość pliku cookie false, aby go rozbroić,

setcookie('cookiename', false);

PS: - To najłatwiejszy sposób na zrobienie tego.

Amit Merchant
źródło
-1

Musisz usunąć pliki cookie z php na swoim serwerze, a także z js dla przeglądarki. (Dokonały one z php, ale pliki cookie są również w kliencie przeglądarki):

Przykład:

if ($_GET['action'] == 'exit'){
            // delete cookies with js and then in server with php:
            echo '
            <script type="text/javascript">
                var delete_cookie = function(name) {
                     document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
                };
                delete_cookie("madw");
                delete_cookie("usdw");
            </script>
            ';
unset($_COOKIE['cookie_name']);
unset($_COOKIE['cookie_time']);
Poncho_333
źródło
Nie potrzebujesz JavaScript, aby ustawić / usunąć wartość cookie. Funkcja php setcookie zrobi to za ciebie php.net/manual/en/function.setcookie.php
Michael Khalili
-5

Większość z was zapomina, że ​​zadziała to tylko na komputerze lokalnym. W domenie będziesz potrzebować wzorca takiego jak ten przykład.

setcookie("example_cookie", 'password', time()-3600, "/", $_SERVER['SERVER_NAME']);
Peter Gruppelaar
źródło
1
Parametr domain będzie oznaczał bieżącą domenę, jeśli zostanie pominięty.
DustWolf,
Chciałem powiedzieć, że twoja odpowiedź jest nieprawidłowa. Będzie działał dla dowolnej domeny, nie tylko na komputerze lokalnym, ponieważ automatycznie użyje bieżącej domeny. A twój komentarz oznacza, że ​​jesteś obrażony czy coś?
DustWolf,
Czy w ogóle czytasz tekst umieszczony powyżej kodu? przestań mnie wkurzać, pracuję. skończyłem rozmawiać z tobą.
Peter Gruppelaar,
Nie rozumiem, dlaczego denerwujesz się na innych użytkowników, którzy wskazują błąd w odpowiedzi. setcookiedziała dla dowolnej domeny, czy to localhost czy nie.
xorinzor
Więc jeśli wszyscy powiedzą, że tak jest ... to musi być coś ewidentnie nie tak z moją odpowiedzią ... fct hat, który został wskazany w tym poście nie ma znaczenia? ... chcesz tylko pewnego rodzaju odpowiedzi kierunkowych i zignoruj ​​globalnych użytkowników, którzy pracują w podobnej sytuacji ... rozumiem ... przestań mnie denerwować, moja odpowiedź nie jest zła.
Peter Gruppelaar