как удалить все cookies нашего сайта на PHP
Мне интересно, могу ли я удалить все куки моего сайта, когда пользователь нажимает на выход, потому что я использовал это как функцию для удаления куки, но это не работает должным образом:
setcookie("user",false);
есть ли способ удалить файлы cookie одного домена в PHP?
11 ответов
взятый с этой страницы, это отменит все куки для вашего домена:
// 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, '/');
}
}
$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, прежде чем какой-либо выход произойдет на вашем сайте.
кроме того, если ваши пользователи выходят из системы, вы также должны удалить/аннулировать их переменные сеанса.
при изменении имени файлов 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-ответ
вы должны знать о различных инструментов отслеживания, таких как 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, Session и т. д., как объясняется в документы.
предоставленные ответы не решили мою проблему,
Это не:
- удалить файлы cookie родительского домена (из a.b.c; удалить b.c; cookies),
- удалите файлы 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
. Таким образом, вы хотите отключить cookies для всех доменов, которые могли удалить cookie:
$host = explode('.', $_SERVER['HTTP_HOST']);
while ($host) {
$domain = '.' . implode('.', $host);
foreach ($_COOKIE as $name => $value) {
setcookie($name, '', 1, '/', $domain);
}
array_shift($host);
}
используйте функцию для очистки cookies:
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
data, в противном случае данные сеанса сохраняются.
<?php
parse_str(http_build_query($_COOKIE),$arr);
foreach ($arr as $k=>$v) {
setCookie("$k","",1000,"/");
}