web-dev-qa-db-ja.com

PHPで私のウェブサイトのすべてのCookieを削除する方法

ユーザーがログアウトをクリックしたときにウェブサイトのすべてのCookieを削除できるかどうか疑問に思っています。これはCookieを削除する機能としてこれを使用しましたが、正しく機能しないためです:

setcookie("user",false);

PHPで1つのドメインのCookieを削除する方法はありますか?

88
Mac Taylor

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

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

ただし、ドメインのアプリケーションでどのCookieが設定されているかを記憶(またはどこかに保存)し、それらをすべて直接削除することをお勧めします。
これにより、すべての値を正しく削除することができます。

40
poke

上記の回答のいくつかに同意します。 「time()-1000」を「1」に置き換えることをお勧めします。値「1」は1970年1月1日を意味し、100%の有効期限が保証されます。したがって:

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

サイトで出力が行われる前に、setcookie関数を呼び出してください。

また、ユーザーがログアウトしている場合は、セッション変数も削除/無効化する必要があります。

3
knittl

Cookieの名前を変更する場合、すべてのCookieを削除するが、1つの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-Answer

2
Roman Holzner

私はこの質問が古いことを知っていますが、これははるかに簡単な代替案です。

header_remove();

しかし、注意してください! ドキュメント で説明されているように、Cookie、セッションなどを含むすべてのヘッダーが消去されます。

2
Borjovsky

提供された回答は私の問題を解決しませんでしたが、

それはしませんでした:

  1. 親ドメインCookieを削除します(a.b.cから; b.cを削除します; Cookie)、
  2. ルート以外のより高いパスからCookieを削除します。

私のスクリプトは、参照してください。

<?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-pathやcookie-domainを知らない場合にのみ使用してください。または、アイデアを使用してバージョンを作成してください。

2

Googleアナリティクスなどのさまざまな追跡ツールもドメインでCookieを使用しているため、GAで正しいデータを取得したい場合は削除しないでください。

動作する唯一のソリューションは、既存のCookieをnullに設定することでした。クライアントからCookieを削除できませんでした。

したがって、ユーザーをログアウトするには、次を使用します。

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

もちろん、これですべてのCookieが削除されるわけではありません。

1
Martin LeBlanc

関数を使用して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を渡すと、sessionデータがクリアされます。そうでない場合、セッションデータは保持されます。

0
Dan Bray

以前の回答はすべて、setcookieが明示的なドメインで使用された可能性があることを見落としていました。さらに、Cookieは上位のサブドメインに設定されている可能性があります。 foo.bar.tar.comドメインにいる場合、tar.comにCookieが設定されている可能性があります。したがって、Cookieをドロップした可能性があるすべてのドメインのCookieを設定解除する必要があります。

$Host = explode('.', $_SERVER['HTTP_Host']);

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

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

    array_shift($Host);
}
0
Gajus