ユーザーがログアウトをクリックしたときに自分のWebサイトのCookieをすべて削除できるかどうか疑問に思っています。これを関数として使用してCookieを削除しましたが、正しく機能しません。
setcookie("user",false);
PHPで1つのドメインのCookieを削除する方法はありますか?
回答:
そのページから取得すると、ドメインのすべての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_COOKIE
値を使用することが$_COOKIE
配列をループするよりも優れている理由が本当にわかりません。その理由はありますか?私には、パーサーの作業量が(2倍)多いように見えます。
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
setcookie( $key, $value, $past, '/' );
}
ただし、ドメインのアプリケーションで設定されたCookieを覚えて(またはどこかに保存して)、それらすべてを直接削除することをお勧めします。
これにより、すべての値を正しく削除することができます。
setcookie( $key, FALSE );
か?(php.net/manual/en/function.setcookie.phpのNotes scetionを参照)
/
あなたが入れた決勝戦の必要性は何setcookie
ですか?
/
クッキーのパスです。ドメインからCookieを削除できるように設定する必要があります。そうしないと、現在のパスに設定され、現在のパスに設定されているものにのみ影響します。
上記の回答のいくつかに同意します。「time()-1000」を「1」に置き換えることをお勧めします。「1」の値は1970年1月1日を意味し、100%の有効期限が保証されます。したがって:
setcookie($name, '', 1);
setcookie($name, '', 1, '/');
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にも基づいています
提供された回答は私の問題を解決しませんでした、
それはしませんでした:
私のスクリプトはそうです、ご覧ください。
<?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が不明な場合にのみ使用してください。または、アイデアを使用してバージョンを作成します。
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が削除されるわけではありません。
0
議論を考慮すると、転送中に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
クリアsession
され、そうでない場合はセッションデータが保持されます。
<?php
parse_str(http_build_query($_COOKIE),$arr);
foreach ($arr as $k=>$v) {
setCookie("$k","",1000,"/");
}