bagaimana menghapus semua cookie dari situs web saya di php

93

Saya bertanya-tanya apakah saya dapat menghapus semua cookie situs web saya ketika pengguna mengklik logout, karena saya menggunakan ini sebagai fungsi untuk menghapus cookie tetapi tidak berfungsi dengan benar:

setcookie("user",false);

Apakah ada cara untuk menghapus cookie satu domain di PHP?

Mac Taylor
sumber
Dalam banyak kasus, ide yang lebih baik adalah menggunakan cookie dengan lebih bijak. Jika Anda menggunakan sesi, satu cookie sudah cukup. Bagaimanapun, lacak cookie mana yang Anda tetapkan, maka Anda tidak memerlukan cara dinamis untuk mengulanginya dan menghapusnya.
gak

Jawaban:

173

PHP setcookie ()

Diambil dari halaman itu, ini akan membatalkan semua cookie untuk domain Anda:

// 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
sumber
9
Saya membaca komentar itu, tapi saya benar-benar tidak mengerti mengapa menggunakan HTTP_COOKIEnilai akan lebih baik daripada mengulang melalui $_COOKIEarray. Apakah Anda punya alasan untuk itu? Bagi saya ini hanya terlihat seperti lebih banyak pekerjaan (ganda) untuk parser.
aduk
Sejauh yang saya tahu, tidak ada perbedaan (kecuali pekerjaan ekstra).
jasonbar
11
@poke: Jika nama cookie ada dalam notasi Array, misalnya: user [username] Maka PHP secara otomatis akan membuat array yang sesuai di $ _COOKIE. Sebagai gantinya gunakan $ _SERVER ['HTTP_COOKIE'] karena ini mencerminkan header Permintaan HTTP yang sebenarnya.
Farhadi
Bagaimana Anda menghapus semua cookie selain cookie atau cookie dengan nilai yang ditetapkan?
Dinginkan Desain Web
2
Saya pernah melihat situasi di mana ada 2 cookie dengan nama yang sama, tetapi dengan pengaturan domain yang berbeda. Salah satunya akan masuk ke dalam array $ _COOKIE, dan yang lainnya tidak. Tapi keduanya akan terlihat di HTTP_COOKIE. Jika Anda ingin membersihkan situasi ini, inilah cara untuk melakukannya.
dlo
43
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
    setcookie( $key, $value, $past, '/' );
}

Namun yang lebih baik adalah mengingat (atau menyimpannya di suatu tempat) cookie mana yang disetel dengan aplikasi Anda di domain dan menghapus semuanya secara langsung.
Dengan cara itu Anda bisa yakin untuk menghapus semua nilai dengan benar.

menyodok
sumber
2
kode yang bagus, tetapi tidak cukup untuk digunakan setcookie( $key, FALSE );?! (lihat Catatan scetion di php.net/manual/en/function.setcookie.php )
Marco Demaio
@Marco Demaio: Seharusnya begitu, tetapi saya telah melihat itu gagal di masa lalu di beberapa server. Tetapi tentu saja, jika berhasil untuk Anda, lakukan saja seperti itu :)
colokkan
seharusnya bukan masalah server, PHP yang melakukannya secara internal. Dan apa kebutuhan final yang /Anda tempatkan setcookie?
Marco Demaio
@Marco Demaio: Ya, dengan server yang saya maksud adalah server php. Ini /adalah jalur cookie. Anda perlu menyetelnya agar Anda dapat menghapus cookie dari domain, jika tidak maka akan disetel ke jalur saat ini, dan hanya memengaruhi cookie yang disetel untuk jalur saat ini.
aduk
@trante Huh !? $ key bukanlah sebuah array, itu kunci.
aduk
16

Saya setuju dengan beberapa jawaban di atas. Saya hanya akan merekomendasikan mengganti "time () - 1000" dengan "1". Nilai "1" berarti 1 Januari 1970, yang memastikan kedaluwarsa 100%. Karena itu:

setcookie($name, '', 1);
setcookie($name, '', 1, '/');
Doug
sumber
1
Saya selalu bertanya-tanya mengapa tidak ada yang mengatakan untuk melakukan ini, dan ini adalah jawaban yang saya cari-cari.
Anther
Mungkin saat ini bukan masalah, tetapi pada satu titik beberapa browser mengabaikan tanggal yang lama, dan nilainya tidak akan dibuang sebagaimana mestinya. Saya yakin IE 7 adalah salah satu contoh yang melakukan ini.
conrad10781
3

pastikan Anda memanggil fungsi setcookie Anda sebelum keluaran apa pun terjadi di situs Anda.

juga, jika pengguna Anda keluar, Anda juga harus menghapus / membatalkan variabel sesi mereka.

rajutan
sumber
2

Saat Anda mengubah nama Cookies Anda, Anda mungkin juga ingin menghapus semua Cookies tetapi menyimpannya:

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

Juga berdasarkan PHP-Answer ini

Roman Holzner
sumber
1
Sintaks salah: 1) tidak ada konstruksi AS di jika klausa 2) ganti "$ cookies" dengan $ _COOKIE
Jeff
2

Jawaban yang diberikan tidak menyelesaikan masalah saya,

Itu tidak:

  1. Hapus cookie domain induk (dari abc; hapus bc; cookie),
  2. Hapus cookie dari jalur yang lebih tinggi selain root.

Skrip saya, lihat.

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

Ini bukan solusi yang paling cantik / aman / optimal, jadi gunakan ini hanya jika Anda tidak mengetahui jalur cookie dan / atau domain cookie. Atau gunakan ide untuk membuat versi Anda.

Wesley Abbenhuis
sumber
Solusi sempurna,
Shakeel Ahmed
1

Anda harus mengetahui berbagai alat pelacakan seperti Google Analytics juga menggunakan cookie di domain Anda dan Anda tidak ingin menghapusnya, jika Anda ingin memiliki data yang benar di GA.

Satu-satunya solusi yang dapat saya lakukan adalah mengatur cookie yang ada ke null. Saya tidak dapat menghapus cookie dari klien.

Jadi untuk mengeluarkan pengguna saya menggunakan yang berikut:

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

Tentu saja ini tidak menghapus SEMUA cookie.

Martin LeBlanc
sumber
7
Saya tidak akan merekomendasikan untuk menyimpan kata sandi pengguna dalam cookie. Itu adalah lubang keamanan yang serius, terutama mengingat 0argumennya berarti cookie bahkan tidak dienkripsi saat transit.
Andrew Ensley
1

Semua jawaban sebelumnya telah mengabaikan bahwa setcookiebisa saja digunakan dengan domain eksplisit. Lebih lanjut, cookie mungkin telah disetel di subdomain yang lebih tinggi, misalnya jika Anda berada di foo.bar.tar.comdomain, mungkin ada cookie yang disetel di tar.com. Oleh karena itu, Anda ingin menghapus cookie untuk semua domain yang mungkin telah menghapus cookie:

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

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

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

    array_shift($host);
}
Gajus
sumber
0

Gunakan fungsi untuk menghapus 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, '/');
    }
}

Jika Anda lulus truemaka itu menghapus sessiondata, jika tidak, data sesi dipertahankan.

Dan Bray
sumber
0

Saya tahu pertanyaan ini sudah tua, tetapi ini adalah alternatif yang jauh lebih mudah:

header_remove();

Tetapi berhati-hatilah! Ini akan menghapus SEMUA header, termasuk Cookies, Session, dll., Seperti yang dijelaskan dalam dokumen .

Borjovsky
sumber
ini tidak benar-benar melakukan apa pun untuk benar-benar menghapus cookie atau apa pun yang serupa dengan gagasan itu karena browser hanya menyimpan cookie yang disimpan sampai kadaluwarsa. meskipun akan membantu jika ada hal lain yang mencoba menelurkan cookie dan mencegahnya melakukannya.
My1
0
<?php
      parse_str(http_build_query($_COOKIE),$arr);
      foreach ($arr as $k=>$v) {
        setCookie("$k","",1000,"/");
      }
Gautam Sharma
sumber
Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan langsung. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah tersebut dan akan membuatnya lebih berguna bagi pembaca di masa mendatang dengan pertanyaan serupa lainnya. Harap edit jawaban Anda untuk menambahkan penjelasan, termasuk asumsi yang Anda buat.
Maximilian Peters