как удалить все куки моего сайта в php - PullRequest
88 голосов
/ 22 февраля 2010

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

setcookie("user",false);

Есть ли способ удалить куки одного домена в PHP?

Ответы [ 11 ]

159 голосов
/ 22 февраля 2010

PHP setcookie ()

При взятии с этой страницы будут удалены все файлы cookie для вашего домена:

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

40 голосов
/ 22 февраля 2010
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
    setcookie( $key, $value, $past, '/' );
}

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

14 голосов
/ 08 июля 2012

Я согласен с некоторыми из приведенных выше ответов. Я бы просто рекомендовал заменить «time () - 1000» на «1». Значение «1» означает 1 января 1970 года, что обеспечивает истечение срока действия 100%. Поэтому:

setcookie($name, '', 1);
setcookie($name, '', 1, '/');
3 голосов
/ 22 февраля 2010

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

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

2 голосов
/ 22 февраля 2018

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

Это не так:

  1. Удалить куки родительского домена (из a.b.c; удалить b.c; куки),
  2. Удалить куки с более высокого пути, кроме 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-домена. Или используйте идею для создания своей версии.

2 голосов
/ 01 января 2018

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

header_remove();

Но будь осторожен! Он удалит ВСЕ заголовки, включая файлы cookie, сессии и т. Д., Как описано в документах .

2 голосов
/ 31 января 2014

Когда вы меняете название своих файлов 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-Ответ

1 голос
/ 24 апреля 2010

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

Единственное решение, которое я смог получить, - установить для существующих файлов cookie значение null. Я не могу удалить куки с клиента.

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

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

Конечно, это не удаляет ВСЕ куки.

0 голосов
/ 19 апреля 2018
<?php
      parse_str(http_build_query($_COOKIE),$arr);
      foreach ($arr as $k=>$v) {
        setCookie("$k","",1000,"/");
      }
0 голосов
/ 14 октября 2017

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

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, в противном случае данные сеанса сохраняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...