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?


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;
}

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.


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
}

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);

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);

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.




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


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?


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);
}

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


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 :)


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.

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.


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");

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');

1

To proste!

setcookie("cookiename", "cookievalue", 1);

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

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.


-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']);

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']);

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.