как удалить все куки моего сайта на php



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



setcookie("user",false);


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

1174   11  

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, прежде чем какой-либо выход произойдет на вашем сайте.

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

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

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

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

Это не:

  1. удалить куки родительского домена (из 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. Поэтому вы хотите отключить файлы cookie для всех доменов, которые могли удалить файл cookie:

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

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

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

    array_shift($host);
}

используйте функцию для очистки файлов 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, '/');
    }
}

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

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

Comments

    Ничего не найдено.