Как удалить куки
Когда я хочу удалить файл cookie, я пытаюсь выполнить следующее:
unset($_COOKIE[‘hello’]);
В браузере Firefox я вижу, что файл cookie все еще существует. Как я могу удалить cookie?
Ответ 1
Вы можете попробовать это:
if (isset($_COOKIE[‘remember_user’]))
unset($_COOKIE[‘remember_user’]);
setcookie(‘remember_user’, null, -1, ‘/’);
return true;
> else
return false;
>
Или установите значение «» и дату истечения срока действия cookie на вчерашний день (или любую дату в прошлом).
setcookie(«hello», «», time()-3600);
Тогда срок действия cookie истечет при следующей загрузке страницы.
Ответ 2
Для надежного удаления файла cookie недостаточно установить для него срок действия в любое время в прошлом, рассчитанный вашим сервером PHP. Это связано с тем, что клиентские компьютеры могут и часто имеют время, отличное от времени вашего сервера.
Лучшая практика — перезаписать текущий файл cookie пустым файлом cookie, срок действия которого истекает через одну секунду в будущем после эпохи (1 января 1970 г., 00:00:00 UTC), следующим образом:
setcookie(«hello», «», 1);
Ответ 3
У меня была такая же проблема в моем коде, и я обнаружил, что это проблема пути cookie. Я установил файл cookie, используя значение пути «/», но не имел никакого значения пути, когда пытался его очистить, поэтому он не очистился. Итак, вот пример того, что сработало:
Установка cookie:
$cookiePath = «/»;
$cookieExpire = time()+(60*60*24);//one day -> seconds*minutes*hours
setcookie(«CookieName»,$cookieValue,$cookieExpire,$cookiePath);
Очистка cookie:
setcookie(«cookieName»,»», time()-3600, $cookiePath);
unset ($_COOKIE[‘cookieName’]);
Надеюсь, это поможет.
Ответ 4
Вот как работает код PHP v7 setcookie(), когда вы запускаете это:
setcookie(‘user_id’,»);
setcookie(‘session’,»);
?>
Из вывода tcpdump во время прослушивания порта 80 сервер отправляет клиенту (браузеру) следующие заголовки HTTP:
Set-Cookie: user_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
Set-Cookie: session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
Наблюдая за пакетами в следующих запросах, браузер больше не отправляет эти файлы cookie в заголовках.
Ответ 5
Если вы хотите полностью удалить cookie со всего вашего текущего домена, следующий код определенно вам поможет :
unset($_COOKIE[‘hello’]);
setcookie(«hello», «», time() — 300,»/»);
Этот код полностью удалит переменную cookie со всего вашего домена, т. е. «/» — это означает, что значение переменной cookie установлено для всего домена, а не только для текущего домена или пути. time() — 300 означает, что он устанавливает предыдущее время, поэтому срок его действия истечет.
Вот так он отлично удаляется.
Ответ 6
В предыдущем ответе я увидел небольшую ошибку в решении. Я согласен, что лучшим решением, вероятно, будет это:
if (isset($_COOKIE[‘remember_user’]))
unset($_COOKIE[‘Hello’]);
unset($_COOKIE[‘HelloTest1’]);
setcookie(‘Hello’, null, -1, ‘/’);
setcookie(‘HelloTest1’, null, -1, ‘/’);
return true;
> else
return false;
>
Но так вы удаляете куки в каждом случае, когда функция unset работает, и тут же создаете новые куки с истекшим сроком действия в случае, когда функция unset не работает. Это означает, что, даже если функция unset сработает, на компьютере все равно останется 2 cookie. С логической точки зрения, поставленная цель — удалить куки, если это возможно, а если это действительно невозможно — сделать их просроченными, чтобы получить самый «чистый» результат.
Поэтому, я думаю, лучше сделать так:
if (isset($_COOKIE[‘remember_user’]))
setcookie(‘Hello’, null, -1, ‘/’);
setcookie(‘HelloTest1’, null, -1, ‘/’);
unset($_COOKIE[‘Hello’]);
unset($_COOKIE[‘HelloTest1’]);
return true;
> else
return false;
>
Ответ 7
$cookie_name = «my cookie»;
$cookie_value = «my value»;
$cookie_new_value = «my new value»;
// Создание cookie,
setcookie($cookie_name, $cookie_value , time() + (86400 * 30), «/»); //86400 = 24 hours in seconds
// Получение значения cookie,
$cookie_value = $_COOKIE[$cookie_name];
// Обновление cookie,
setcookie($cookie_name, $cookie_new_value , time() + (86400 * 30), «/»);
// Удаление cookie,
setcookie($cookie_name, » , time() — 3600, «/»); // time() — 3600 означает установку даты истечения срока действия cookie на последний час.
Ответ 8
Вы должны удалить куки с помощью php на вашем сервере, а также с помощью js для вашего браузера. ( о ни создаются с помощью php, но файлы cookie также находятся в клиенте браузера):
Пример:
if ($_GET[‘action’] == ‘exit’)
// удаляем куки с помощью js, а затем на сервере с помощью php:
echo ‘
var delete_cookie = function(name)
document.cookie = name + «=;expires=Thu, 01 Jan 1970 00:00:01 GMT;»;
>;
delete_cookie(«madw»);
delete_cookie(«usdw»);
‘;
unset($_COOKIE[‘cookie_name’]);
unset($_COOKIE[‘cookie_time’]);
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Как удалить cookie в PHP? [дубликат]
Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом.
Отслеживать
ответ дан 5 авг 2016 в 15:20
28.7k 22 22 золотых знака 61 61 серебряный знак 141 141 бронзовый знак
Я пробовал Ваш вариант вот так — Setcookie(‘1k’, «» ,time()-1000); Это не помогло. Еще важно удалить её до загрузок любых заголовков. я в этом плохо разбираюсь , но у меня шаблон подгружается всё время не тот что нужен
5 авг 2016 в 15:36
@AndreiSukharev без кастлей не как. браузер делает запрос в ответ получает куки. можно через кастыль перезагрузить страницу дважды первый раз отправив запрос а второй раз загрузить уже с новыми кукисами.
Удаление cookie в php?
На нее можно перейти по ссылке в шапке с любой страницы сайта.
После авторизации пользователя нужно редиректнуть на предыдущую страницу (ту с которой перешли).
Для этого я создаю куки в самом начале файла.
Затем внизу если пользователь прошел авторизацию затираю куки и перенаправляю на предыдущую страницу.
IsAuthorized()) < $temp = $_COOKIE['prev_addr']; setcookie("prev_addr","",time()-10000); LocalRedirect($temp); >?>
Но кука не удаляется.
- Вопрос задан более трёх лет назад
- 20310 просмотров
setcookie
Альтернативная сигнатура доступна с PHP 7.3.0 (именованные параметры не поддерживаются):
setcookie ( string $name , string $value = «» , array $options = [] ): bool
Функция setcookie() задаёт значение cookie, которое будет отправлено клиенту вместе с другими HTTP-заголовками. Как и другие заголовки, файл cookie должен передаваться до того, как будут выведены любые другие данные скрипта (это ограничение протокола). Для этого нужно вызывать функцию до остального вывода, включая вывод тегов и , а также пустые строки и пробельные символы.
После установки cookie к нему можно будет получить доступ через суперглобальную переменную $_COOKIE при следующей загрузке страницы. Значения cookie также может содержать суперглобальная переменная $_REQUEST .
Список параметров
Стандарт » RFC 6265 даёт конкретные указания о том, как нужно интерпретировать каждый из параметров setcookie() . name
Значение cookie. Это значение будет сохранено на клиентском компьютере; не записывайте в cookie секретные данные. Значение, присвоенное cookie c именем name , допустим, ‘cookiename’ , будет доступно через $_COOKIE[‘cookiename’] .
Время истечение срока действия cookie. Это метка времени Unix, то есть количество секунд с начала эпохи. Один из способов установить значение — добавить количество секунд до истечения срока действия cookie к результату вызова функции time() . Например, выражение time() + 60 * 60 * 24 * 30 установит срок действия cookie, который закончится через 30 дней. Другой вариант — вызвать функцию mktime() . Если задать 0 или пропустить аргумент, срок действия cookie закончится с окончанием сессии (при закрытии браузера).
Замечание:
Можно заметить, что параметр expires_or_options принимает в качестве значения метку времени Unix, а хранит его в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT , причина этому то, что PHP делает это преобразование автоматически.
Путь на сервере, по которому будут доступны значения cookie. Если задать «/» , cookie будут доступны во всем домене domain . Если задать «/foo/» , cookie будут доступны только из директории /foo/ и её поддиректорий (например, /foo/bar/ ) домена domain . Значение по умолчанию — текущая директория, в которой PHP устанавливает cookie.
Домен или поддомен, которому доступны cookie. Задание поддомена (например, «www.example.com» ) сделает cookie доступными в нём и во всех поддоменах (например, w2.www.example.com). Чтобы сделать cookie доступными для всего домена, включая поддомены, нужно просто указать имя домена (то есть «example.com» ).
Старые браузеры, следующие устаревшему стандарту » RFC 2109, могут требовать . перед доменом, чтобы включались все поддомены.
Указывает на то, что значение cookie должно передаваться от клиента по защищённому соединению HTTPS. Если задано true , cookie от клиента будут переданы на сервер, только если установлено защищённое соединение. При передаче cookie от сервера клиенту программист веб-сервера должен следить за тем, чтобы cookie этого типа передавались по защищённому каналу (например, с учётом значения суперглобальной переменной $_SERVER[«HTTPS»] ).
Если задано true , cookie будут доступны только через HTTP-протокол. То есть cookie не будут доступны скриптовым языкам наподобие JavaScript. Было высказано предположение, что этот параметр в состоянии эффективно уменьшить кражу личных данных через XSS-атаку (хотя он поддерживается не всеми браузерами), но это утверждение часто оспаривается. Может принимать значения true или false .
Ассоциативный массив ( array ), который может содержать любой из ключей: expires , path , domain , secure , httponly и samesite . Если в массиве окажется другой ключ, будет выдана ошибка уровня E_WARNING . Значения имеют тот же смысл, который описан для параметров с тем же именем. Значение элемента samesite должно быть либо None , либо Lax или Strict . Если какая-то из разрешённых опций не указана, её значения по умолчанию совпадают с значениями по умолчанию явных параметров. Если элемент samesite не указан, функция не установит cookie-атрибут SameSite.
Замечание:
To set a cookie that includes attributes that aren’t among the keys listed, use header() .
Возвращаемые значения
Если перед вызовом функции клиенту уже передавался какой-либо вывод (теги, пустые строки, пробелы, текст и т.п.), setcookie() потерпит неудачу и вернёт false . Если setcookie() успешно отработает, то вернёт true . Это, однако, не означает, что клиентское приложение (браузер) правильно приняло и обработало cookie.
Список изменений
| Версия | Описание |
|---|---|
| 8.2.0 | Формат даты отправляемых cookie теперь «D, d M Y H:i:s \G\M\T» ; ранее он был «D, d-M-Y H:i:s T» . |
| 7.3.0 | Добавлена альтернативная подпись, поддерживающая массив опций options . Эта подпись поддерживает также настройку cookie-атрибута SameSite. |
Примеры
Следующие примеры иллюстрируют ряд способов отправки cookies.
Пример #1 Пример использования setcookie()
$value = ‘что-то откуда-то’ ;
setcookie ( «TestCookie» , $value );
setcookie ( «TestCookie» , $value , time ()+ 3600 ); /* срок действия 1 час */
setcookie ( «TestCookie» , $value , time ()+ 3600 , «/~rasmus/» , «example.com» , 1 );
Стоит отметить, что значение cookie перед отправкой клиенту подвергается URL-кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie() . Посмотреть содержимое наших тестовых cookie можно, запустив один из следующих примеров:
// Вывести одно конкретное значение cookie
echo $_COOKIE [ «TestCookie» ];
?php
// В целях тестирования и отладки может пригодиться вывод всех cookie
print_r ( $_COOKIE );
?>
Пример #2 Пример удаления cookie посредством setcookie()
Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом. Это запустит механизм браузера, удаляющий истёкшие cookie. В примерах ниже показано, как удалить cookie, заданные в предыдущих примерах:
// установка даты истечения срока действия на час назад
setcookie ( «TestCookie» , «» , time () — 3600 );
setcookie ( «TestCookie» , «» , time () — 3600 , «/~rasmus/» , «example.com» , 1 );
?>?php
Пример #3 setcookie() и массивы
Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:
// отправка cookie
setcookie ( «cookie[three]» , «cookiethree» );
setcookie ( «cookie[two]» , «cookietwo» );
setcookie ( «cookie[one]» , «cookieone» );
?php
// после перезагрузки страницы, выведем cookie
if (isset( $_COOKIE [ ‘cookie’ ])) foreach ( $_COOKIE [ ‘cookie’ ] as $name => $value ) $name = htmlspecialchars ( $name );
$value = htmlspecialchars ( $value );
echo » $name : $value
\n» ;
>
>
?>
Результат выполнения приведённого примера:
three : cookiethree two : cookietwo one : cookieone
Замечание: Указание символов-разделителей наподобие [ и ] в составе имени cookie не соответствует 4-му разделу стандарта RFC 6265, но должно поддерживаться агентами пользователя, как указано в разделе 5 стандарта RFC 6265.
Примечания
Замечание:
Разрешено буферизировать вывод для отправки вывода до вызова этой функции, при этом вывод в браузер буферизируется на сервере до тех пор, пока не будет отпрален. Это делают вызовом в скрипте функций ob_start() и ob_end_flush() , либо включают директиву конфигурации output_buffering в файле php.ini или в файлах конфигурации сервера.
- Cookie станут видимыми только после перезагрузки страницы, для которой они должны быть видны. Для проверки, правильно ли установлены cookie, их проверяют при следующей загрузке страницы до истечения их срока действия. Срок действия cookie задают в параметре expires_or_options . Хороший способ отладить наличие файлов cookie — просто вызывать функцию print_r($_COOKIE); .
- При удалении cookie должны быть заданы те же параметры, что и при установке. Если в качестве значения задать пустую строку, а остальные параметры соответствуют предыдущему вызову функции setcookie, то cookie c заданным именем будет удалён на удалённом клиенте. Внутренне это выглядит так: cookie будет присвоено значение «deleted» , а срок действия переносится на год в прошлое.
- Поскольку установка значения false приведёт к удалению cookie, не нужно задавать cookie логические значения. Вместо этого можно указать 0 для false и 1 для true.
- Имена cookie разрешено устанавливать массивом имён, которые будут доступны в PHP-скрипте как массивы, но в системе пользователя они будут храниться в виде отдельных записей. Для задания cookie c несколькими именами и значениями рекомендовано вызывать функцию explode() . Не рекомендовано пользоваться для этих целей функцией serialize() , поскольку это нарушает безопасность.
Множественные вызовы функции setcookie() выполняются в порядке вызова.
Смотрите также
- header() — Отправляет необработанный (сырой) HTTP-заголовок
- setrawcookie() — Отправляет cookie без URL-кодирования значения
- раздел cookies
- » RFC 6265
- » RFC 2109