Zastanawiam się, czy mogę usunąć wszystkie pliki cookie mojej witryny, gdy użytkownik kliknie wylogowanie, ponieważ użyłem tej funkcji do usuwania plików cookie, ale nie działa ona poprawnie:
setcookie("user",false);
Czy istnieje sposób na usunięcie plików cookie jednej domeny w PHP?
Odpowiedzi:
PHP setcookie ()
Zaczerpnięte z tej strony, spowoduje to usunięcie wszystkich plików cookie w Twojej domenie:
// 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
źródło
HTTP_COOKIE
wartości byłoby lepsze niż przechodzenie w pętli przez$_COOKIE
tablicę. Czy masz ku temu powód? Dla mnie wygląda to na więcej (podwójną) pracę dla parsera.$past = time() - 3600; foreach ( $_COOKIE as $key => $value ) { setcookie( $key, $value, $past, '/' ); }
Jeszcze lepiej jest jednak zapamiętać (lub gdzieś je przechowywać), które pliki cookie są ustawione w Twojej aplikacji w domenie i usunąć wszystkie bezpośrednio.
W ten sposób możesz mieć pewność, że wszystkie wartości zostały poprawnie usunięte.
źródło
setcookie( $key, FALSE );
?! (patrz przegląd notatek na php.net/manual/en/function.setcookie.php )/
którym umieściłeśsetcookie
?/
jest ścieżka pliku cookie. Musisz to ustawić, aby można było usunąć pliki cookie z domeny, w przeciwnym razie jest ustawiona na bieżącą ścieżkę i wpływa tylko na te, które są ustawione dla bieżącej ścieżki.Zgadzam się z niektórymi z powyższych odpowiedzi. Zalecałbym po prostu zamianę „time () - 1000” na „1”. Wartość „1” oznacza 1 stycznia 1970 roku, co gwarantuje wygaśnięcie 100%. W związku z tym:
setcookie($name, '', 1); setcookie($name, '', 1, '/');
źródło
upewnij się, że wywołujesz funkcję setcookie, zanim jakiekolwiek dane wyjściowe pojawią się w Twojej witrynie.
również, jeśli Twoi użytkownicy się wylogowują, powinieneś również usunąć / unieważnić ich zmienne sesji.
źródło
Kiedy zmieniasz nazwę swoich plików cookie, możesz również chcieć usunąć wszystkie pliki cookie, ale zachować jeden:
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, '/'); } } }
Również w oparciu o tę odpowiedź PHP
źródło
Podane odpowiedzi nie rozwiązały mojego problemu,
To nie mialo miejsca:
Widzisz, mój skrypt to robi.
<?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, '.'))); } }
Nie jest to najbardziej ładne / bezpieczne / optymalne rozwiązanie, więc używaj go tylko wtedy, gdy nie znasz ścieżki pliku cookie i / lub domeny pliku cookie. Lub skorzystaj z pomysłu, aby stworzyć swoją wersję.
źródło
Powinieneś wiedzieć, że różne narzędzia śledzące, takie jak Google Analytics, również używają plików cookie w Twojej domenie i nie chcesz ich usuwać, jeśli chcesz mieć prawidłowe dane w GA.
Jedynym rozwiązaniem, które mogłem uruchomić, było ustawienie istniejących plików cookie na zero. Nie mogłem usunąć plików cookie z klienta.
Dlatego do wylogowania użytkownika używam:
setcookie("username", null, time()+$this->seconds, "/", $this->domain, 0); setcookie("password", null, time()+$this->seconds, "/", $this->domain, 0);
Oczywiście nie powoduje to usunięcia WSZYSTKICH plików cookie.
źródło
0
argument, który oznacza, że plik cookie nie jest nawet szyfrowany podczas przesyłania.We wszystkich poprzednich odpowiedziach pominięto, że
setcookie
domena mogła zostać użyta z jawną domeną. Ponadto plik cookie mógł zostać umieszczony w wyższej subdomenie, np. Jeśli byłeś wfoo.bar.tar.com
domenie, może być ustawiony plik cookietar.com
. Dlatego chcesz usunąć pliki cookie dla wszystkich domen, które mogły je usunąć:$host = explode('.', $_SERVER['HTTP_HOST']); while ($host) { $domain = '.' . implode('.', $host); foreach ($_COOKIE as $name => $value) { setcookie($name, '', 1, '/', $domain); } array_shift($host); }
źródło
Użyj funkcji, aby wyczyścić pliki 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, '/'); } }
Jeśli zdasz
true
, wyczyścisession
dane, w przeciwnym razie dane sesji zostaną zachowane.źródło
Wiem, że to pytanie jest stare, ale jest to znacznie łatwiejsza alternatywa:
Ale bądź ostrożny! Spowoduje to usunięcie WSZYSTKICH nagłówków, w tym plików cookie, sesji itp., Jak wyjaśniono w dokumentacji .
źródło
<?php parse_str(http_build_query($_COOKIE),$arr); foreach ($arr as $k=>$v) { setCookie("$k","",1000,"/"); }
źródło