как удалить все cookies нашего сайта на PHP

Мне интересно, могу ли я удалить все куки моего сайта, когда пользователь нажимает на выход, потому что я использовал это как функцию для удаления куки, но это не работает должным образом:

setcookie("user",false);

есть ли способ удалить файлы cookie одного домена в PHP?

11 ответов


PHP setcookie ()

взятый с этой страницы, это отменит все куки для вашего домена:

// 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


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

еще лучше, однако, помнить (или хранить его где-то), какие куки установлены с вашим приложением в домене и удалить все это напрямую.
Таким образом, вы можете быть уверены, что удалите все значения правильно.


Я согласен с некоторыми ответами выше. Я бы просто рекомендовал заменить "time () -1000" на "1". Значение "1"означает 1 января 1970 года, что обеспечивает экспирацию 100%. Таким образом:

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

убедитесь, что вы вызываете свою функцию setcookie, прежде чем какой-либо выход произойдет на вашем сайте.

кроме того, если ваши пользователи выходят из системы, вы также должны удалить/аннулировать их переменные сеанса.


при изменении имени файлов cookie вы также можете удалить все файлы cookie, но сохранить один:

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

также на основе этого PHP-ответ


вы должны знать о различных инструментов отслеживания, таких как Google Analytics также использовать куки на вашем домене, и вы не хотите, чтобы удалить их, если вы хотите иметь правильные данные в GA.

единственным решением, которое я мог получить, было установить существующие куки в null. Я не смог удалить куки из клиента.

поэтому для выхода из системы я использую следующее:

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

конечно, это не удаляет все куки.


Я знаю, что этот вопрос старый, но это гораздо более простая альтернатива:

header_remove();

но будьте осторожны! Он удалит все заголовки, включая Cookies, Session и т. д., как объясняется в документы.


предоставленные ответы не решили мою проблему,

Это не:

  1. удалить файлы cookie родительского домена (из a.b.c; удалить b.c; cookies),
  2. удалите файлы cookie с более высокого пути, кроме root.

мой сценарий, понимаете.

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

это не самое красивое / безопасное / оптимальное решение, поэтому используйте его только в том случае, если вы не знаете cookie-путь и/или cookie-домен. Или используйте идею для того, чтобы создать версия.


все предыдущие ответы упустили из виду, что setcookie может использоваться с явным доменом. Кроме того, файл cookie мог быть установлен на более высоком поддомене, например, если вы были на foo.bar.tar.com домен, может быть установлен cookie на tar.com. Таким образом, вы хотите отключить cookies для всех доменов, которые могли удалить cookie:

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

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

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

    array_shift($host);
}

используйте функцию для очистки cookies:

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

Если вы передадите true тогда понятно session data, в противном случае данные сеанса сохраняются.


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