php'de web sitemin tüm çerezlerini nasıl silebilirim


93

Bir kullanıcı oturumu kapatmayı tıkladığında web sitemin tüm çerezlerini silebilir miyim, çünkü bunu çerezleri silmek için bir işlev olarak kullandım, ancak düzgün çalışmıyor:

setcookie("user",false);

PHP'de bir etki alanının çerezlerini silmenin bir yolu var mı?


Çoğu durumda, daha iyi fikir, çerezleri daha akıllıca seçerek kullanmak olacaktır. Oturumları kullanırsanız, bir çerez yeterli olacaktır. Her neyse, hangi çerezleri ayarladığınızı takip edin, o zaman bunları yinelemek ve silmek için dinamik bir yönteme ihtiyacınız olmayacak.
gak

Yanıtlar:


174

PHP setcookie ()

Bu sayfadan alındığında, bu, etki alanınız için tüm çerezleri kaldırır:

// 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
Bu yorumu okudum, ama HTTP_COOKIEdeğeri kullanmanın neden $_COOKIEdizide döngü yapmaktan daha iyi olduğunu anlamıyorum . Bunun için herhangi bir sebebiniz var mı? Bana göre sadece ayrıştırıcı için daha fazla (çift) çalışma gibi görünüyor.
dürtmek

Anlayabildiğim kadarıyla bir fark yok (ekstra iş dışında).
jasonbar

11
@poke: Eğer tanımlama bilgisi isimleri Dizi gösteriminde ise, örneğin: kullanıcı [kullanıcı adı] O zaman PHP otomatik olarak $ _COOKIE içinde karşılık gelen bir dizi yaratacaktır. Bunun yerine, gerçek HTTP İsteği başlıklarını yansıttığı için $ _SERVER ['HTTP_COOKIE'] kullanın.
Farhadi

Tanımlama bilgileri veya belirli değerlere sahip tanımlama bilgileri dışındaki tüm tanımlama bilgilerini nasıl silersiniz?
Chill Web Designs

2
Aynı ada sahip ancak farklı alan ayarlarına sahip 2 çerezin olduğu durumlar gördüm. Bunlardan biri $ _COOKIE dizisine girecek, diğeri olmayacak. Ancak ikisi de HTTP_COOKIE'de görünecektir. Bu durumu temizlemek istiyorsanız, bunu yapmanın yolu budur.
dlo

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

Daha da iyisi, uygulamanızla hangi çerezlerin bir etki alanında ayarlandığını hatırlamak (veya bir yerde saklamak) ve bunların tümünü doğrudan silmektir.
Bu şekilde tüm değerleri doğru bir şekilde sildiğinizden emin olabilirsiniz.


2
harika kod, ancak kullanmak için yeterli değil setcookie( $key, FALSE );mi? (en Notları scetion bakınız php.net/manual/en/function.setcookie.php )
Marco DeMaio

@Marco Demaio: Öyle olmalı, ancak geçmişte bazı sunucularda başarısız olduğunu gördüm. Sizin için çalışıyorsa Ama tabii, sadece bu :) gibi do
dürtmek

bu bir sunucu meselesi olmamalı, bunu dahili olarak yapan PHP'dir. Ve /yerleştirdiğiniz finale ne gerek var setcookie?
Marco Demaio

@Marco Demaio: Evet, sunucu ile php sunucusunu kastettim. /Çerez yoludur. Tanımlama bilgilerini etki alanından kaldırabileceğiniz şekilde ayarlamanız gerekir, aksi takdirde geçerli yola ayarlanır ve yalnızca geçerli yol için ayarlananları etkiler.
dürtmek

@trante Huh !? $ key bir dizi değil, bir anahtardır.
dürtmek

16

Yukarıdaki cevapların bazılarına katılıyorum. Sadece "time () - 1000" i "1" ile değiştirmenizi tavsiye ederim. "1" değeri, 1 Ocak 1970 anlamına gelir ve% 100 sona erme sağlar. Bu nedenle:

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

1
Her zaman merak etmişimdir, neden kimse bunu yapmamı söylemedi ve aradığım cevap bu.
Anter

Muhtemelen şu anda bir sorun değil, ancak bir noktada bazı tarayıcılar bu kadar eski bir tarihi görmezden geldi ve değerler olması gerektiği gibi atılmayacaktı. IE 7'nin bunu yapan bir örnek olduğuna inanıyorum.
conrad10781

3

Sitenizde herhangi bir çıktı oluşmadan önce setcookie işlevinizi çağırdığınızdan emin olun.

ayrıca, kullanıcılarınız oturumu kapatıyorsa, oturum değişkenlerini de silmeniz / geçersiz kılmanız gerekir.


2

Çerezlerinizin adını değiştirdiğinizde, tüm Çerezleri silmek, ancak birini saklamak isteyebilirsiniz:

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

Ayrıca bu PHP-Cevabına göre


1
Yanlış sözdizimi: 1) fıkra 2) $ _COOKIE ile "$ çerezleri" yerine eğer hiçbir GİBİ yapı yoktur
Jeff

2

Verilen cevaplar sorunumu çözmedi,

Yapmadım:

  1. Ana etki alanı çerezlerini kaldırın (abc'den; bc'yi kaldırın; çerezleri kaldırın),
  2. Çerezleri kök dışında daha yüksek bir yoldan kaldırın.

Benim senaryom var, bakın.

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

En güzel / güvenli / en uygun çözüm değildir, bu nedenle bunu yalnızca çerez yolunu ve / veya çerez alanını bilmiyorsanız kullanın. Veya kendi sürümünüzü oluşturmak için fikri kullanın.


Mükemmel çözüm,
Shakeel Ahmed

1

Google Analytics gibi çeşitli izleme araçlarının da etki alanınızda çerez kullandığını bilmelisiniz ve GA'da doğru verilere sahip olmak istiyorsanız bunları silmek istemezsiniz.

Çalışabildiğim tek çözüm, mevcut çerezleri boş olarak ayarlamaktı. Çerezleri istemciden silemedim.

Dolayısıyla, bir kullanıcının oturumunu kapatmak için aşağıdakileri kullanıyorum:

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

Elbette bu TÜM çerezleri silmez.


8
Bir kullanıcının şifresini bir çerezde saklamanızı tavsiye etmem. Bu ciddi bir güvenlik açığıdır, özellikle 0argüman, çerezin aktarılırken bile şifrelenmediği anlamına gelir.
Andrew Ensley

1

Önceki tüm cevaplar, setcookieaçık bir alan adı ile kullanılmış olabileceğini gözden kaçırdı . Ayrıca, çerez daha yüksek bir alt foo.bar.tar.cometki alanında ayarlanmış olabilir , örneğin, bir etki alanındaysanız, üzerinde bir çerez ayarlanmış olabilir tar.com. Bu nedenle, çerezi bırakmış olabilecek tüm etki alanları için çerezlerin ayarını kaldırmak istiyorsunuz:

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

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

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

    array_shift($host);
}

0

Çerezleri temizlemek için işlevi kullanın:

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

Eğer geçerseniz trueo zaman temizler sessionaksi oturum verileri korunur, veri.


0

Bu sorunun eski olduğunu biliyorum ama bu çok daha kolay bir alternatif:

header_remove();

Ama dikkat et! Dokümanlarda açıklandığı gibi Çerezler, Oturum vb. Dahil TÜM başlıkları silecektir .


tarayıcı, saklanan çerezleri süresi dolana kadar sakladığından, çerezleri veya buna benzer şeyleri gerçekten kaldırmak için gerçekten hiçbir şey yapmaz. ancak başka şeylerin çerez üretmeye çalışması ve bunu yapmasını engellemesi yardımcı olur.
MY1

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

Sınırlı ve anında yardım sağlayabilecek bu kod parçacığı için teşekkür ederiz. Uygun bir açıklama, bunun neden soruna iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar da dahil olmak üzere bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin.
Maximilian Peters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.