PHPで私のウェブサイトのすべてのクッキーを削除する方法


92

ユーザーがログアウトをクリックしたときに自分のWebサイトのCookieをすべて削除できるかどうか疑問に思っています。これを関数として使用してCookieを削除しましたが、正しく機能しません。

setcookie("user",false);

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


ほとんどの場合、Cookieをより賢く選択的に使用することをお勧めします。セッションを使用する場合、1つの Cookieで十分です。とにかく、設定したCookieを追跡すれば、それらを繰り返して削除する動的な方法は必要ありません。
2016

回答:


172

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


9
私はそのコメントを読みましたが、HTTP_COOKIE値を使用することが$_COOKIE配列をループするよりも優れている理由が本当にわかりません。その理由はありますか?私には、パーサーの作業量が(2倍)多いように見えます。
2010

私が知る限り、違いはありません(追加の作業を除く)。
jasonbar 2010

11
@poke:cookie名が配列表記の場合(例:user [username])、PHPは$ _COOKIEに対応する配列を自動的に作成します。代わりに$ _SERVER ['HTTP_COOKIE']を使用してください。これは、実際のHTTP要求ヘッダーをミラーリングするためです。
Farhadi、2011年

Cookieまたは設定された値を持つCookieを除くすべてのCookieをどのように削除しますか
Chill Web Designs

2
同じ名前でドメイン設定が異なる2つのCookieがある状況を見てきました。それらの1つは$ _COOKIE配列に入れますが、もう1つは入れません。ただし、どちらもHTTP_COOKIEで表示されます。この状況を一掃したい場合は、これがその方法です。
dlo

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

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


2
素晴らしいコードですが、使用するには十分ではありませんsetcookie( $key, FALSE );か?(php.net/manual/en/function.setcookie.phpのNotes scetionを参照
Marco Demaio '26

@Marco Demaio:あるはずですが、過去に一部のサーバーで失敗することはありました。しかし、もちろん、それがあなたのために働くなら、ちょうどそのようにしてください:)
突く

サーバーの問題ではなく、内部で行うのはPHPです。そして、/あなたが入れた決勝戦の必要性は何setcookieですか?
Marco Demaio、2011年

@Marco Demaio:ええ、サーバーとは、phpサーバーのことです。/クッキーのパスです。ドメインからCookieを削除できるように設定する必要があります。そうしないと、現在のパスに設定され、現在のパスに設定されているものにのみ影響します。
突く

@trante Huh !? $ keyは配列ではなく、キーです。
突く

16

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

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

1
なぜだれもこれを行うだけだとは誰も言わないのかといつも疑問に思っていました。これが私が探していた答えの1つです。
Anther 2013

現在のところ問題ではない可能性がありますが、一部のブラウザでは、古い日付を一緒に無視していたため、値が破棄されませんでした。IE 7はこれを行った1つの例だと思います。
conrad10781

3

サイトで出力が発生する前に、必ずsetcookie関数を呼び出してください。

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


2

Cookieの名前を変更する場合は、すべてのCookieを削除し、1つは保持することもできます。

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にも基づいています


1
誤った構文:1)if句にAS構造がありません2) "$ cookies"を$ _COOKIEに置き換えます
Jeff

2

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

それはしませんでした:

  1. 親ドメインのCookieを削除(abcから、bcを削除、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が不明な場合にのみ使用してください。または、アイデアを使用してバージョンを作成します。


完璧なソリューション
Shakeel Ahmed

1

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が削除されるわけではありません。


7
ユーザーのパスワードをCookieに保存することはお勧めしません。これは重大なセキュリティホールであり、特に0議論を考慮すると、転送中にCookieが暗号化されることすらありません。
Andrew Ensley

1

以前のすべての回答は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);
}

0

関数を使用して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

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

header_remove();

しかし、注意してください!docsで説明されいるように Cookie、Sessionなどを含むすべてのヘッダーが消去されます。


ブラウザは、Cookieが期限切れになるまで保存されたCookieを保持するだけなので、Cookieやその概念に類似したものを実際に削除することはありません。ただし、他のものがCookieを生成しようとして、それらが実行されないようにする場合には役立ちます。
My1

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

このコードスニペットをありがとうございます。このコードスニペットは、制限された、即時の助けを提供する可能性があります。適切な説明は、なぜこれが問題の優れた解決策であるかを示すことにより、長期的な価値を大幅に改善し、他の同様の質問を持つ将来の読者にとってより有用になるでしょう。回答を編集して、仮定を含めて説明を追加してください。
Maximilian Peters
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.