Как "физически" удалить куку?

SlavikSG

Новичок
Как "физически" удалить куку?

Как физически удалить куку? Именно физическую запись куки на винте.

Ставлю куку:
SetCookie("UserID", $Id, Time()+3600);

Затем у меня возникла задача, не перезапуская браузер, удалить куку. Удалить именно физически.

Команда:
SetCookie("UserID");
лишь обнуляет куку и удалена она будет только тогда, когда пользователь сам, вручную, перезапустит свой браузер. Но это в моем случае очень неудобно. Нужно именно физическое удаление куки из браузера не перезапуская его.

Хелп, плииз! :)
 

FractalizeR

Новичок
Зачем ее удалять "именно физически"? Разве не достаточно того, что она в скрипт не будет передаваться? Для этого expire параметр нужно установить равным timestamp в прошлом (скажем, time()-3600). Тогда при следующем запросе cookie уже не будет передаваться. И браузер закрывать будет не обязательно. Почитайте мануал внимательно.

Если куки должен удаляться потому, что в нем хранится суперсекретная информация, то эту информацию лучше куда-нибудь вынести. Например, в сессию.
 

SlavikSG

Новичок
Автор оригинала: FractalizeR ...Почитайте мануал внимательно...
Да я читал...
Просто решил обработать ситуацию, когда кук с UserID от клиента поступил нормально. И по имени, и по дате. Но, допустим, кук этот пришел с неверным значением. Вот, просто, испортилось это значение со временем, и все тут! :) И посему в базе MySQL такой ID не был найден. И вот и хотелось бы, чтобы браузер без всяких предисловий и сообщений об ошибках взял и обновил страницу. И предложил бы по новой авторизоваться на сайте. Как только юзер авторизуется, тот кук ему пропишется заново и все встанет на свои места.

Я конечно понимаю, что ситуация эта идиотская, и вряд ли когда-нибудь произойдет, но все же вот так мне захотелось... :)

В общем, я нашел ошибку.

Писать нужно не так:
SetCookie("UserID");
а вот так:
SetCookie("UserID","");
при этом кук удаляется сразу без всяких следов и перезагрузок браузера. Очень хорошо это в Опере видно.

Я новенький в ПХП. Можно вопрос не в тему?
Как заставить браузер после какой-нибудь проверки на ошибку автоматически обновить текущую страницу?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
И вот и хотелось бы, чтобы браузер без всяких предисловий и сообщений об ошибках взял и обновил страницу
1. Браузер сам по себе ничего не делает.
2. Что тебе мешает в скрипте реализовать такую ситуацию?

Как заставить браузер после какой-нибудь проверки на ошибку автоматически обновить текущую страницу?
Не нужно никого ничему заставлять.
нужно ИСПРАВЛЯТЬ ошибки.

И, наверное, юзер должен знать, что он делает не так.
Например напиши ему
Кука устарела, Юзера с таким ай-ди нет...

Лично меня, ситуации, когда тупо скрипт перенаправляет без объяснений причин -
БЕСИТ УЖАСНО.
 

SlavikSG

Новичок
...Не нужно никого ничему заставлять.
нужно ИСПРАВЛЯТЬ ошибки...

Ну, смотри сюда:
Я ставлю кук пользователю на месяц с уникальным ID. И этот же ID я прописываю в базу MySQL. После этого пользователь лезет на сайт и тот приветствует его сразу, без всякой авторизации. Затем я умышленно залезаю в свою базу MySQL и изменяю ID этого пользователя. После чего юзер полезет на сайт и программа, если эту ошибку не отследить, просто раскарячится так, что даже форму авторизации пользователю не выдаст. Ведь кук поступает и он правильный. Просто не сошлись ID кука и базы.

Повторяю, ситуация надуманная. Ну, а вдруг!...

А сейчас все происходит так, что пользовтатель даже ничего не замечает вообще. Совершенно не заметно, что браузер обновил страницу. Я проверял уже не раз. Там просто ничего не успевает появляться. Сразу выводятся поля формы для авторизации так, как будто вышло время действия кука. То есть, пользователю, вообще, ничего не нужно читать. Никаких сообщений об ошибках и прочее...

Кстати, как обновить страницу автоматом, я нашел. Методом посылки заголовка в браузер клиента:
Header("Location: {$_SERVER['PHP_SELF']}");
Exit;

Это совершенно незаметно. Поверь мне на слово. :)
 

FractalizeR

Новичок
Вы что, храните в куках ID пользователя? Я вам этого делать крайне не рекомендовал бы. Это небезопасно. Лучше ID пользователя хранить в сессиях.

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

Header("Location: {$_SERVER['PHP_SELF']}");
Какое же это обновление страницы? Это просто переадресация на другой URL. Кроме того, эту операцию можно выполнить только до первого вывода данных в браузер.
 

Фанат

oncle terrible
Команда форума
SlavikSG
только лучше писать
PHP:
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); 
exit;
-~{}~ 07.02.08 23:04:

и программа, если эту ошибку не отследить, просто раскарячится так, что даже форму авторизации пользователю не выдаст. Ведь кук поступает и он правильный. Просто не сошлись ID кука и базы.
Это проблемы программы, вообще-то.
И если твоя программа не умеет обрабатывать такие ситуации, а надеется на куки пользователя, то она со временем обязательно встанет в ту самую позу, которую ты описал.

-~{}~ 07.02.08 23:04:

В частности, зацикленный редирект. Мечта любого юзера. Да и сервера тоже.
 

antson

Новичок
Партнер клуба
SlavikSG
Вы что во всех местах работаете с кукой напрямую ?

Если да, то заведи у себя переменную для этих целей $clientID
и в начале инициализируй ее значением "пользователь не авторизован" , потом уже ее значение меняешь исходя
из того что там передали в куках, если все корректно ,
то присваеваешь переменной.

последовательность проверок:
1. это запрос логина (проверка по базе и узнавание со стартом сессии)

2. сессия открыта ? ид клиента из сессии

3. первый запрос страницы (рефер не твой сайт),
то если есть кука отвечающая за автологин ? пробуем
стартануть сессию с выполнением проверки на авторизацию
 

SlavikSG

Новичок
Это проблемы программы, вообще-то.
И если твоя программа не умеет обрабатывать такие ситуации, а надеется на куки пользователя, то она со временем обязательно встанет в ту самую позу, которую ты описал.
Не, понял. Что я сделал не так? Ошибку, как программист, я отслеживаю. Программа не раскорячивается.

От юзера поступает кука с неправильным значением. Я делаю поиск по базе. Результат нулевой. Вместо вывода кучи сообщений для пользователя, которые ему придется читать и что-то при этом нажимать, я просто делаю так, как будто куки и не было вовсе. Человек видит перед собой поля ввода, заново авторизуется и все становится нормально раз и навсегда.

Если писать конкретно именно так:
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit;
то в браузере получается адрес написанный, как бы, два раза подряд. Что, разумеется, приводит к ошибке. Почему так происходит, я не понимаю. Но в интернете именно в таком виде приведены примеры для этого дела. Скорее всего это правильно и так должно быть. Но у меня не пашет.
 

AmdY

Пью пиво
Команда форума
:) тему в мусор или хумор отправят?
ваши ставки.
чел так много знает, кроме адресса мануала, подсказываю http://www.php.net/manual/ru/ там и про cookies есть, и про редирект.
 

SlavikSG

Новичок
Вы что во всех местах работаете с кукой напрямую?
В смысле как напрямую? (вообще, речь идет об авторизации на сайте, как вы уже наверное догадались.)

1. В самом начале проверяю, "Существует ли вообще такая кука в природе".
2. Если существует, и из нее поступил ID пользователя, то начинаю искать по этому ID пользователя в базе, чтобы в итоге авторизовать этого пользователя на сайте автоматически.
3. Если не нахожу такого пользователя, то физически и сразу удаляю эту куку, как заведомо неверную, и заставляю пользователя заново авторизоваться.
4. Если пользователь авторизовался с поставленной галкой "Запомнить меня", то заново генерирую уникальный ID, прописываю его в базу пользователей в MySQL и ставлю новую куку с этим ID пользователя в браузер клиента.

Если куки у пользователя отключены, то программ работает несколько иначе.

Про тонкости авторизацию у меня еще куча вопросов, но это не в этой теме...

-~{}~ 08.02.08 09:43:

Автор оригинала: AmdY
:) тему в мусор или хумор отправят?
ваши ставки.
чел так много знает, кроме адресса мануала, подсказываю http://www.php.net/manual/ru/ там и про cookies есть, и про редирект.
...сказал местный гуру и послал новичка в Google со словами:
- Там ты найдешь ответ на свой вопрос.
 

Фанат

oncle terrible
Команда форума
SlavikSG
Ты очень все хорошо и красиво описал.
Вместо вывода кучи сообщений для пользователя, которые ему придется читать и что-то при этом нажимать, я просто делаю так, как будто куки и не было вовсе.
А теперь ответь себе на вопрос - а что, если кука все-таки будет?
Вообще-то, хозяин моего браузера - я. А не ты. И ты можешь только рекомендовать мне удалить куку. А уж что там браузер сделает - тебе неведомо.
НЕЛЬЗЯ полагаться на реакцию браузера. Вообще никогда в веб-программировании нельзя строить свою программу на том, что браузер пришлет или не пришлет какой-то ответ.

браузере получается адрес написанный, как бы, два раза подряд.
что значит "как бы два раза подряд"?

-~{}~ 08.02.08 10:04:

3. Если не нахожу такого пользователя, то физически и сразу удаляю эту куку, как заведомо неверную, и заставляю пользователя заново авторизоваться.
Ну и прекрасно. Только зачем страницу-то обновлять?
 

SlavikSG

Новичок
...А теперь ответь себе на вопрос - а что, если кука все-таки будет?...
Погоди, ты не понял. В том и дело, что кука есть. Она поступает от клиента нормально. Просто в ней, по какой-то странной причине, сидит неверный ID. Ситуация эта может никогда и не произойти. Сам понимаешь, с какого это такого перепугу ID в куке пользователя разрушилось или стало неверным? Глупость! Конечно, такого может никогда не произойти. Ну, а вдруг?! :)

Что касается "обновлять страницу" после удаления неправильной куки, то это уже, скорее всего, относится к стилю программирования. У меня этого стиля в PHP еще нет совсем. Не успел выработаться. :) Наверное, в моем условии нужно было еще раз вызвать форму для авторизации, но мне показалось некрасивым писать повторный вызов формы. Вроде как, лучше обновить страницу. А так конечно, может это и неверно.

Кстати, опять не в тему:
А может страница пользователя не обновиться по какой-то причине? Типа, если клиент поставил запрет на это у себя в браузере.
Не бейте сильно. Я еще новичок... :)

Что касается "двойного адреса", то выглядит он после обновления так:
http://ntelecom.tula.net/proba/ntelecom.tula.net/proba/index.php
а должен выглядеть так:
http://ntelecom.tula.net/proba/index.php
Это настоящий адрес. В нем и ковыряюсь... :)
 

Beavis

Banned
SlavikSG
значит ты неправильно адрес страницы в редиректе пишешь
 

Ноябрь

Новичок
SlavikSG
Сначала приходят куки, потом генерируется страница, неверные куки, ну и генерируй страницу с формой авторизации (или какую там тебе надо).

надеюсь, что ID в твоих куках это не первичный ключ в таблице пользователей.
 
Сверху