Php удалить куки при закрытии браузера

Обновлено: 07.07.2024

Есть где-то предполагаемая кука которая есть в бд и на компе юзера.
Вот так она выглядит:

Если юзерский токен совпадает с токеном в бд (этот токен - значение поля cookie в бд), его логинит (при правильности введенных данных, само собой)

Это кнопка выхода из аккаунта. Она выполняет logout.php

Как я понял из статей, такая конфигурация должна убивать куку. При повторной авторизации если что она создается заново, с эти проблем нет.

Но logout.php выполняется, однако код

Продолжает выполнятся => кука живет

Надо как то заставить куку пойти отдохнуть, помогите плиз

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

При попытке убить сессию и куки ничего не получается
Добрый день. Начал писать регистрацию, использовал механизмы сессий для сохранения куки. Так вот.

Как окончательно и бесповоротно запретить кэширование изображений браузером?
Как окончательно и бесповоротно запретить кэширование изображений браузером? Приведенные ниже.

Как убить файлы, созданные сессией?
Стартуем сессию и в определенной папке создаются ее служебные файлы. Со временем их там.

newArray, попробуйте добавить 4-ый параметр в setcookie '/' newArray, попробуйте добавить 4-ый параметр в setcookie '/' Странно. Я добавил параметр path как вы и сказали "/", ничего не изменилось
Причем я вардампнул $_COOKIE и мне выдало именно ту куку что прописана в бд, т.е. у юзера она активна должна быть. Но убираться она не хочет(

newArray, чтобы "убить" куку, достаточно установить для нее пустое/недействительное значение, а не экспериментировать с expire (для этого параметра достаточно установить 0). Установка expire при установке куки у вас тоже странная. Также имеет смысл поддерживать expire и на стороне сервера.

Добавлено через 5 минут
Проверка в шаблоне тоже странная. Обычно проверяют существование $user или используют его логический метод или свойство.

Добавлено через 5 минут
Проверка в шаблоне тоже странная. Обычно проверяют существование $user или используют его логический метод или свойство.

Что с ней не так? Кука активна в любом случае, я вардампаю массив $_COOKIE и она там есть, просто она удаляться не хочет. Ничего не помогает, где то ошибка

Добавлено через 1 минуту
Имеется в виду если куки (токен) юзера совпадает с куки (токеном) в бд, то его можно пустить и он будет активен пока не истечет expire (10 лет вроде)

а не экспериментировать с expire (для этого параметра достаточно установить 0) Вы думаете я это не читал? И что мне это дало, я же кнопку выхода из аккаунта делаю, с этим проблема)

Нет. Только если вы уже успели проверить ее существование где-то выше в коде.

А должна? Покажите хоть один нормальный источник, где это написано.

Иногда полезно читать официальное руководство, а не непонятно что.

Добавлено через 1 минуту

Если задать 0 или пропустить этот аргумент, срок действия cookie истечет с окончанием сессии (при закрытии браузера)

И что вы этим хотели сказать? Я написал, что это не так? Хотя, конечно, бывает и не так

Добавлено через 2 минуты
newArray, забыл еще добавить, что про сравнение произвольных строк вам тоже нужно почитать. Две разные строки могут быть равны

То что получив expires 0 браузер не удалит куку, а как раз будет ее продолжать использовать до закрытия браузера, а какой-нибудь chrome и после закрытия не удалит. По идее пустая строка должна удалять куку, но были проблемы с некоторыми браузерами. Так что лучше всего для удаления и значение пустое, и expires истекший, и еще четвертый параметр всегда использовать, и при установке тоже В том то и дело, что должно работать. А не работает. Я ваши намёки совсем не понимаю. Пытался вообще всяко. И как советовали, и как не советовали, даже переписывал и браузеры другие пробовал. Jewbacabra, "пустая строка" может не удалить куку, но она переустановит значение. Этого достаточно. Да, но чтоб лишние байты не гонять по сети лучше подстраховаться newArray, какие намеки? Понимайте слова "очистить куки", как "очистить/переустановить значения кук", тогда ваше представление о работе браузеров будет более точным, чем сейчас.

Господи, я уже заплатить готов кому-нибудь. Сижу и втыкаю в буквы, вообще не соображаю. Давайте попробую подробно объяснить.

При регистрации пользователя создается поле в бд с названием "cookie", его значение - ТОКЕН, рандомные буквы типа ksdfkasfmasmfasfmkw. Идём далее:

Вот этот код проверяет пароль из хеша при авторизации (в бд он лежит) с введённым паролем, который был введён в input
Если введённый пароль == пароль из БД, выполняется код:

Так как поле cookie уже присутствует в бд, мы сравниваем значение токена куки юзера с токеном куки в бд, которое соответствует аккаунту, в который пользователь входит. Если КУКИ ЮЗЕРА == КУКИ ЮЗЕРА В БД, он логинится и запоминается на какое-то время (время жизни куки). При всём при этом, всё вышесказанное работает при условии что логин и пароль введены верно. Только тогда идет сравнение токена куки юзера с токеном куки этого аккаунта в бд. Его пускает в аккаунт и он будет залогинен пока куку не сотрут с пк или пока он сам не выйдет.

Так вот, есть кнопка

Кнопка, нажимая на которую куки стирается и забывается вообще до того момента, пока юзер не запросит его снова (не авторизируется ещё раз)

Вот код файла (logout.php), на который ссылается кнопка

Я скоро помру уже, честное слово, не хочет оно работать как надо. Вот это весь скрипт что присутствует.

Добавлено через 2 минуты
И я же в заголовке темы всё сказал, что у меня не получается удалить к чертям эту куку. Мне не надо её никуда переустанавливать :ССС

Список параметров

Все аргументы, за исключением name , являются необязательными. Если нужно пропустить какой-либо аргумент, можно вместо него поставить пустую строку (""). Это не относится к аргументу expire . Так как он принимает значение типа integer, для его замены пустая строка не подходит. Используйте вместо нее ноль (0).

» RFC 6265 дает конкретные указания, как нужно интерпретировать каждый из параметров setcookie() . name

Время, когда срок действия cookie истекает. Это метка времени Unix, то есть это количество секунд с начала эпохи. Другими словами, желательно задавать это время с помощью функции time() , прибавляя время в секундах, через которое срок действия cookie должен истечь. Либо можно воспользоваться функцией mktime() . time()+60*60*24*30 установит срок действия cookie 30 дней. Если задать 0 или пропустить этот аргумент, срок действия cookie истечет с окончанием сессии (при закрытии броузера).

Замечание:

Можно заметить, что expire принимает в качестве значения метку времени Unix, а хранит его в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT. PHP делает внутреннее преобразование автоматически.

Указывает на то, что значение cookie должно передаваться от клиента по защищенному HTTPS соединению. Если задано TRUE , cookie от клиента будет передано на сервер, только если установлено защищенное соединение. При передаче cookie от сервера клиенту следить за тем, чтобы cookie этого типа передавались по защищенному каналу, должен программист веб-сервера (стоит обратить внимание на $_SERVER["HTTPS"] ).

Возвращаемые значения

Если перед вызовом функции клиенту уже передавался какой-либо вывод (тэги, пустые строки, пробелы, текст и т.п.), setcookie() вызовет отказ и вернет FALSE . Если setcookie() успешно отработает, то вернет TRUE . Это, однако, не означает, что клиентское приложение (броузер) правильно приняло и обработало cookie.

Примеры

Ниже представлено несколько примеров, как отправлять cookie:

<?php
$value = 'что-то где-то' ;

setcookie ( "TestCookie" , $value );
setcookie ( "TestCookie" , $value , time ()+ 3600 ); /* срок действия 1 час */
setcookie ( "TestCookie" , $value , time ()+ 3600 , "/

Стоит отметить, что значение cookie перед отправкой клиенту подвергается URL-кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie() (работает в PHP 5). Посмотреть содержимое наших тестовых cookie можно, запустив один из следующих примеров:

<?php
// Вывести одно конкретное значение cookie
echo $_COOKIE [ "TestCookie" ];
echo $HTTP_COOKIE_VARS [ "TestCookie" ];

// В целях тестирования и отладки может пригодиться вывод всех cookie
print_r ( $_COOKIE );
?>

Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом. Это запустит механизм броузера, удаляющий истекшие cookie. В примерах ниже показано, как удалить cookie, заданные в предыдущих примерах:

<?php
// установка даты истечения срока действия на час назад
setcookie ( "TestCookie" , "" , time () - 3600 );
setcookie ( "TestCookie" , "" , time () - 3600 , "/

Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:

<?php
// отправка cookie
setcookie ( "cookie[three]" , "cookiethree" );
setcookie ( "cookie[two]" , "cookietwo" );
setcookie ( "cookie[one]" , "cookieone" );

// после перезагрузки страницы, выведем cookie
if (isset( $_COOKIE [ 'cookie' ])) foreach ( $_COOKIE [ 'cookie' ] as $name => $value ) $name = htmlspecialchars ( $name );
$value = htmlspecialchars ( $value );
echo " $name : $value <br />\n" ;
>
>
?>

Результат выполнения данного примера:

Список изменений

Примечания

Замечание:

Чтобы иметь возможность отправлять вывод скрипта до вызова этой функции, можно воспользоваться буферизацией. В этом случае весь вывод скрипта помещается в буфер на сервере и остается там, пока вы явно не отправите его броузеру. Управление буферизацией осуществляется функциями ob_start() и ob_end_flush() в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.

Замечание:

Если PHP директива register_globals включена (задано значение on), значения cookie помимо всего прочего будут помещаться в переменные. Для примеров выше будет существовать переменная $TestCookie . Тем не менее, рекомендуется использовать $_COOKIE .

При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.

I see in my cookie browser from firefox that the cookie still exists. How can I really remove the cookie?

277k 61 61 gold badges 297 297 silver badges 286 286 bronze badges 10.2k 25 25 gold badges 82 82 silver badges 125 125 bronze badges

22 Answers 22

You May Try this

4,546 5 5 gold badges 38 38 silver badges 52 52 bronze badges


7,890 4 4 gold badges 40 40 silver badges 49 49 bronze badges working fine but when try to reload page. it saw cookie set with old data why?.

Set the value to "" and the expiry date to yesterday (or any date in the past)

Then the cookie will expire the next time the page loads.

10.2k 5 5 gold badges 48 48 silver badges 64 64 bronze badges If you put a date too far in the past, IE will bark and igores it, i.e. the value will not be removed.

A clean way to delete a cookie is to clear both of $_COOKIE value and browser cookie file :


3,445 1 1 gold badge 23 23 silver badges 20 20 bronze badges I keep going down the page and the answers keep getting better, funny. But this is the best one, stop looking here.

To reliably delete a cookie it's not enough to set it to expire anytime in the past, as computed by your PHP server. This is because client computers can and often do have times which differ from that of your server.

The best practice is to overwrite the current cookie with a blank cookie which expires one second in the future after the epoch (1 January 1970 00:00:00 UTC), as so:


8,074 5 5 gold badges 34 34 silver badges 48 48 bronze badges


@PaulSkinner the epoch date is independent of time zones, the computer does that computation for you. @PaulSkinner of course, the rest of your comment is perfectly fine.

That will unset the cookie in your code, but since the $_COOKIE variable is refreshed on each request, it'll just come back on the next page request.

To actually get rid of the cookie, set the expiration date in the past:


58k 9 9 gold badges 120 120 silver badges 175 175 bronze badges @PratikCJoshi Only if your code looks for it later on. instead of time()-3600 you should set 1 (1 second after unix epoq)

I had set the cookie using a path value of "/", but didn't have any path value when I tried to clear it, so it didn't clear. So here is an example of what worked:

Setting the cookie:

Clearing the cookie:

Hope that helps.

1,806 2 2 gold badges 16 16 silver badges 25 25 bronze badges 87.5k 10 10 gold badges 124 124 silver badges 122 122 bronze badges

This is how PHP v7 setcookie() code works when you do:

5,271 9 9 gold badges 45 45 silver badges 103 103 bronze badges

Just set the value of cookie to false in order to unset it,

PS:- That's the easiest way to do it.


This will throw Fatal Error if declare(strict_types=1); are defined. This did not work at all, no errors, no warnings, no cookie deleted.

To delete cookie you just need to set the value to NULL:

"If you've set a cookie with nondefault values for an expiration time, path, or domain, you must provide those same values again when you delete the cookie for the cookie to be deleted properly." Quote from "Learning PHP5" book.

So this code should work(works for me):

Setting the cookie: setcookie('foo', 'bar', time() + 60 * 5);

Deleting the cookie: setcookie('foo', '', time() + 60 * 5);

But i noticed that everybody is setting the expiry date to past, is that necessary, and why?


If you want to delete the cookie completely from all your current domain then the following code will definitely help you.

This code will delete the cookie variable completely from all your domain i.e; " / " - it denotes that cookie variable's value all set for all domain not just for current domain or path. time() - 300 denotes that it sets to a previous time so it will expire.

Thats how it's perfectly deleted.


113 1 1 gold badge 1 1 silver badge 11 11 bronze badges

Just set the expiration date to one hour ago, if you want to "remove" the cookie, like this:

You should use the filter_input() function for all globals which a visitor can enter/manipulate, like this:


6,155 9 9 gold badges 39 39 silver badges 64 64 bronze badges instead of time() - 3600 you should set 1 (1 second after unix epoc)

I know that there has been a long time since this topic has been created but I saw a little mistake within this solution (I can call it like that, because it's a detail). I agree that the better solution is probably this solution:

После передачи клиенту cookie станут доступны через массив $_COOKIE при следующей загрузке страницы. Значения cookie также есть в $_REQUEST .

Список параметров

» RFC 6265 даёт конкретные указания, как нужно интерпретировать каждый из параметров setcookie() . name

Время, когда срок действия cookie истекает. Это метка времени Unix, то есть количество секунд с начала эпохи. Другими словами, желательно задавать это время с помощью функции time() , прибавляя время в секундах, через которое срок действия cookie должен истечь. Либо можно воспользоваться функцией mktime() . time()+60*60*24*30 установит срок действия cookie 30 дней. Если задать 0 или пропустить этот аргумент, срок действия cookie истечёт с окончанием сессии (при закрытии браузера).

Замечание:

Можно заметить, что expires принимает в качестве значения метку времени Unix, а хранит его в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT . PHP делает это преобразование автоматически.

Старые браузеры, следующие устаревшему документу » RFC 2109, могут требовать . перед доменом, чтобы включались все поддомены.

Указывает на то, что значение cookie должно передаваться от клиента по защищённому соединению HTTPS. Если задано true , cookie от клиента будет передано на сервер, только если установлено защищённое соединение. При передаче cookie от сервера клиенту программист веб-сервера должен следить за тем, чтобы cookie этого типа передавались по защищённому каналу (стоит обратить внимание на $_SERVER["HTTPS"] ).

Возвращаемые значения

Если перед вызовом функции клиенту уже передавался какой-либо вывод (теги, пустые строки, пробелы, текст и т.п.), setcookie() потерпит неудачу и вернёт false . Если setcookie() успешно отработает, то вернёт true . Это, однако, не означает, что клиентское приложение (браузер) правильно приняло и обработало cookie.

Список изменений

Версия Описание
7.3.0 Добавлена альтернативная подпись, поддерживающая массив опций options . Эта подпись поддерживает также настройку cookie-атрибута SameSite.

Примеры

Ниже представлено несколько примеров, как отправлять cookie:

<?php
$value = 'что-то откуда-то' ;

setcookie ( "TestCookie" , $value );
setcookie ( "TestCookie" , $value , time ()+ 3600 ); /* срок действия 1 час */
setcookie ( "TestCookie" , $value , time ()+ 3600 , "/

Стоит отметить, что значение cookie перед отправкой клиенту подвергается URL-кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie() . Посмотреть содержимое наших тестовых cookie можно, запустив один из следующих примеров:

<?php
// Вывести одно конкретное значение cookie
echo $_COOKIE [ "TestCookie" ];

// В целях тестирования и отладки может пригодиться вывод всех cookie
print_r ( $_COOKIE );
?>

Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом. Это запустит механизм браузера, удаляющий истёкшие cookie. В примерах ниже показано, как удалить cookie, заданные в предыдущих примерах:

<?php
// установка даты истечения срока действия на час назад
setcookie ( "TestCookie" , "" , time () - 3600 );
setcookie ( "TestCookie" , "" , time () - 3600 , "/

Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:

<?php
// отправка cookie
setcookie ( "cookie[three]" , "cookiethree" );
setcookie ( "cookie[two]" , "cookietwo" );
setcookie ( "cookie[one]" , "cookieone" );

// после перезагрузки страницы, выведем cookie
if (isset( $_COOKIE [ 'cookie' ])) foreach ( $_COOKIE [ 'cookie' ] as $name => $value ) $name = htmlspecialchars ( $name );
$value = htmlspecialchars ( $value );
echo " $name : $value <br />\n" ;
>
>
?>

Результат выполнения данного примера:

Замечание: Использование разделительных символов, таких как [ и ] как часть имени файла cookie, не соответствует RFC 6265, раздел 4, но предполагается, что оно поддерживается пользовательскими агентами в соответствии с RFC 6265, раздел 5.

Примечания

Замечание:

Чтобы иметь возможность отправлять вывод скрипта до вызова этой функции, можно воспользоваться буферизацией. В этом случае весь вывод скрипта помещается в буфер на сервере и остаётся там, пока вы явно не отправите его браузеру. Управление буферизацией осуществляется функциями ob_start() и ob_end_flush() в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.

При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.

Читайте также: