|
Название: Cookie Отправлено: vasa_c от 03 Август, 2007, 09:38:35 HTTP-Cookies или Куки — служебная информация, посылаемая веб-сервером на компьютер пользователя, для сохранения в браузере.
По сути, это аналог переменных, которые можно хранить у пользователя. Механизм их установки и получения следующий: 1. При запросе страницы браузером, сервер формирует ответ, в заголовках которого указывает, что следует установить соответствующие куки. 2. Браузер получает ответ и сохраняет значения кук. 3. При последующем запросе страницы того же сайта, браузер в заголовках запроса посылает куки на сервер. Область применения Первое, что нужно помнить - куки хранятся у клиента и он может делать с ними что хочет. Пользователи Firefox даже не обязаны обладать базовыми техническими знаниями - там куки можно просмотреть и изменить, прямо в меню. Второе - некоторый процент населения услышав краем уха, что-то про страшные куки и потерю личной информации, куки отключает, даже не разобравшись в сути вопроса. Поэтому, куки подходят для сохранения каких-либо настроек пользователя. Например, интерфейсных - упорядочил табличку по одному из столбцов, зашел в следующий раз, а упорядочивание сохранено. Подходят они так же для сбора общей усредненной статистики по достаточно большому количеству человек. Например, при отслеживании уникальных пользователей на сайте. Если их около 100 000, то скорее всего, подавляющее большинство не будет отключать или подделывать куки. Для хранения конфеденциальных данных они не подходят. Для идентификации пользователей подходят с оговорками. Например, после авторизации вы можете положить пользователю в куку его логин и на следующих страницах идентифицировать его уже по нему. Но ничто (кроме технической грамотности) не помешает человеку зайдя под логином "misha", потом исправить соответствующую куку на "admin". Обычно же, в куку кладут идентификатор сеанса, представляющий собой случайную 32-разрядную строку. Тут уже надежды на то, что пользователь не сможет подобрать чужой идентификатор, значительно выше. Еще один момент - число кук одного сайта ограничено (обычно пара десятков). Их суммарный объем так же ограничен (несколько килобайт). Поэтому хранить много информации не получится. Если это необходимо, используйте куки для идентификации пользователя, а связанную с этим пользователем информацию, храните на сервере. Установка кук В PHP куки устанавливаются функцией setCookie(). Её параметры: name - имя куки value - значение. Установка пустой строки, позволяет удалить уже существующую куки. expire - время (unix-формат) устаревания куки. Установка времени, меньше текущего так же позволяет удалить куку. Обратите внимание, что это именно время устаревания, а не время жизни. Т.е. для установки куку на час следует делать так: PHP setCookie("cook", "value", time() + 3600); // Правильно setCookie("cook", "value", 3600); // Не правильно path - каталог, на который распространяется кука. По умолчанию - каталог сценария, который эту куку установил. Здесь таится достаточно распространенная ошибка - в большинстве случаев программист хочет установить куку на весь сайт, но забывая про этот аргумент, ставит её только на каталог, а потом долго ищет ошибку. Нужно указывать четко: domain - позволяет установить куку на основной домен и поддомены. ".domain.com" распространит ее действие на поддомены данного домена. Надеюсь, все понимают, что поставить такую куку можно только с одного из этих поддоменов. Так же не старайтесь поставить её на домен первого уровня, например, ".ru" :) secure - запрещяет передавать куку по HTTP. Можно только по HTTPS. Помните, что куки, являются http-заголовками и на них так же распространяется проблема с "Cannot add header information". Получение кук. Массив $_COOKIE При запросе страницы, до вызова сценария, PHP формирует массив $_COOKIE (наряду с $_GET, $_POST и др). В него, попадают пришедшие куки, которые можно оттуда получить. По этому поводу помните следующие вещи: $_COOKIE заполняется перед стартом сценария. Во время выполнения сценария это обычный массив (разве что суперглобальный). Имеют смысл только как операции с элементами обычного массива. Никакие куки в браузере клиента от этого не появятся и не удалятся. Устанавливайте и удаляйте куки при помощи setCookie(). setCookie() устанавливает заголовок ответа, который будет послан браузеру. В следующий раз браузер при запросе отправит куку серверу и она будет записана в $_COOKIE при запуске сценария. Искать куку в том же сценарии не имеет смысла: Название: Cookie Отправлено: pyhtelkin от 03 Август, 2008, 04:58:58 Можно ли в одном и том же запросе совмещать удаление и постановку одной и той же куки? Именно постановку, но с предварительным удалением её же.
Название: Cookie Отправлено: adw0rd от 03 Август, 2008, 05:23:13 pyhtelkin, юбилейную тему поднял :)
Название: Cookie Отправлено: megabit от 03 Август, 2008, 05:25:38 pyhtelkinх еще один некропостер :-)
Название: Cookie Отправлено: adw0rd от 03 Август, 2008, 05:45:46 Алексей, да ладно, он же по делу! Чего сразу некропостер то...?
Название: Cookie Отправлено: adw0rd от 03 Август, 2008, 05:46:40
покажи как именно Название: Cookie Отправлено: KENDO от 03 Август, 2008, 06:30:11 Хм... куки никак не удалить, кроме как поставить прошедшее время.
А вот перезаписать, думаю, можно (т.е. фактически новую информацию пишем). Название: Cookie Отправлено: adw0rd от 03 Август, 2008, 07:08:52 Хм... куки никак не удалить, кроме как поставить прошедшее время.KENDO, это и есть удаление куки, так как просроченные куки - удаляются. А вот перезаписать, думаю, можно (т.е. фактически новую информацию пишем).Переписать их можно без сомнения можно. Название: Cookie Отправлено: pyhtelkin от 03 Август, 2008, 09:36:02 Поправка. Да, практически я ее собираюсь перезаписывать, но предварительно еще и удаляя (через просрочку срока ее годности). Для меня принципиально важен вопрос, будет ли эта операция возможна. Понимаю что необходимость ее многим непонятна из-за банальности, но мне кажется что в ней есть реально практический смысл, И ЕЩЕ исходя из того что я сознательно хочу отказаться от проверок времен жизней.
Итак, есть план: 1) [удалить куку "А"] 2) [поставить куку "А"] В чем и был вопрос, состоятся ли сии события на стороне клиента, и сохранится ли их последовательность? Название: Cookie Отправлено: adw0rd от 03 Август, 2008, 09:38:01 pyhtelkin, зачем удалять, если ты ее всерано создаешь? Просто измени ее и все.
Название: Cookie Отправлено: pyhtelkin от 03 Август, 2008, 09:46:52 Adw0rd, скажем так ..... я встретил ситуацию, при которой последовательность этих действий имеет смысл. Цель - сделать корректный обработчик статуса принятия кук не на основе анализа временных параметров.
Название: Cookie Отправлено: adw0rd от 03 Август, 2008, 10:07:10 pyhtelkin,
Все имена вымышлены, любое совпадение является случайным. Название: Cookie Отправлено: adw0rd от 03 Август, 2008, 10:09:32 pyhtelkin, а теперь серьезно.
* Удалять можно только при помощи изменения времени жизни куки. * Да, ты можешь удалить и тут же создать в одном сценарии, но я не проверял. И интересно почему, если у тебя возникла такая ситуация, то ты не проверил можно ли проводить такие операции?? Название: Cookie Отправлено: pyhtelkin от 03 Август, 2008, 10:48:47 Про как удалять знал. В целом - тоже понятно. Но вот интересно бы услышать еще тех кто проверял.
А вот стоит ли в механизме проверщика возможности установки кук, делать еще предварительную проверку возможности их установки - тут я не знаю, видимо надо будет посоветоваться. Но т.к. это есть отдельный вопрос, и он несколько другой природы, под него заведем отдельную тему на отдельном форуме, для специалистов других областей. =)) Название: Cookie Отправлено: adw0rd от 03 Август, 2008, 10:59:04 pyhtelkin, больше не курите... вам вредно.
Куки: (http://www.faqs.org/rfcs/rfc2965 читать "5.3 Implementation Limits") 20 на домен, 4 кб данных на куку. Проверка: Название: Cookie Отправлено: Professor от 28 Август, 2008, 10:58:48 Для каждого браузера своя кука??
Или я что то не правильно написал? И можно ли сделать что бы использовался только 1 кук? Название: Cookie Отправлено: Frozzeg от 28 Август, 2008, 11:01:53 кука то в броузере хранится - следовательно да
Название: Cookie Отправлено: adw0rd от 29 Август, 2008, 12:33:13
6.3 Implementation Limits http://www.w3.org/Protocols/rfc2109/rfc2109 http://www.faqs.org/rfcs/rfc2965.html Название: Cookie Отправлено: Professor от 29 Август, 2008, 11:09:09 Там все на английском=(((
Название: Cookie Отправлено: adw0rd от 29 Август, 2008, 11:56:27 Professor, RFC - это основной документ на который нужно опираться. Можешь поискать русскую версию, ведь номер есть у этих документов.
Жаль, что ты не на английском :) http://www.google.ru/translate_t Название: Cookie Отправлено: Professor от 29 Август, 2008, 12:41:58 Я ПОСЕЩАЛ http://translate.google.ru/translate?hl=ru&sl=en&u=http://www.w3.org/Protocols/rfc2109/rfc2109&sa=X&oi=translate&resnum=1&ct=result&prev=/search%3Fq%3Drfc2109%26complete%3D1%26hl%3Dru%26lr%3D%26newwindow%3D1%26sa%3DG%26pwst%3D1
Там что то про печенье =)) 4.3.4 Отправка Печенье к Родной Serverа Если чесно, то такой перевод полностью прочитать и вникнуть не возможно. Бегло просмотрев,выхватив понятные фразы, понял что там написано то что и везде. Что кука храница на компе пользователя в виде текстового файла. Что каждая создается отдельно каждым браузером не видел. Поэтому и решил,почему бы всем браузерам не брать 1 файл с таким то именем и оставленный с такого то сайта. Теперь понял что глупость спросил. Название: Cookie Отправлено: igrayka от 23 Ноябрь, 2009, 07:27:08 Уважаемый,adw0rd.
Если есть возможность помоги пожалуйста, я делаю авторизацию для своей cms и мне кажется дело в куки. вот код, в результате чего после регистрации, я начинаю проходить авторизацию и меня не пускает Код авторизации PHP <?php // Страница авторизации # Функция для генерации случайной строки function generateCode($length=6) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789"; $code = ""; $clen = strlen($chars) - 1; while (strlen($code) < $length) { $code .= $chars[mt_rand(0,$clen)]; } return $code; } # Соединямся с БД include_once "connect_to_mysql.php"; if(isset($_POST['submit'])) { # Вытаскиваем из БД запись, у которой логин равняеться введенному $query = mysql_query("SELECT user_id, user_password FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1"); $data = mysql_fetch_assoc($query); # Сравниваем пароли if($data['user_password'] === md5(md5($_POST['password']))) { # Генерируем случайное число и шифруем его $hash = md5(generateCode(10)); if(!@$_POST['not_attach_ip']) { # Если пользователя выбрал привязку к IP # Переводим IP в строку $insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')"; } # Записываем в БД новый хеш авторизации и IP mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'"); # Ставим куки setcookie("id", $data['user_id'], time()+60*60*24*30); setcookie("hash", $hash, time()+60*60*24*30); # Переадресовываем браузер на страницу проверки нашего скрипта header("Location: check.php"); exit(); } else { print "Вы ввели неправильный логин/пароль"; } } ?> <form method="POST"> Логин <input name="login" type="text"><br> Пароль <input name="password" type="password"><br> Не прикреплять к IP(не безопасно) <input type="checkbox" name="not_attach_ip"><br> <input name="submit" type="submit" value="Войти"> </form> PHP <?php// connect to your MySQL database here include_once "connect_to_mysql.php"; // Скрипт проверки # Соединямся с БД if (isset($_COOKIE['id']) and isset($_COOKIE['hash'])) { $query = mysql_query("SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = '".intval($_COOKIE['id'])."' LIMIT 1"); $userdata = mysql_fetch_assoc($query); if(($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id']) or (($userdata['user_ip'] !== $_SERVER['REMOTE_ADDR']) and ($userdata['user_ip'] !== "0"))) { setcookie("id", "", time() - 3600*24*30*12, "/"); setcookie("hash", "", time() - 3600*24*30*12, "/"); print "Хм, что-то не получилось"; } else { print "Привет, ".$userdata['user_login'].". Всё работает!"; } } else { print "Включите куки"; } ?> глянь пожалуйста Название: Cookie Отправлено: md5 от 23 Ноябрь, 2009, 07:43:46 adw0rd, давай
мы на тебя надеемся :) Название: Cookie Отправлено: NRG от 23 Ноябрь, 2009, 07:48:45 adw0rd, потом я тебе еще скину пару своих тасков...
глянешь пожалуйста ? Название: Cookie Отправлено: igrayka от 23 Ноябрь, 2009, 08:04:39 )))))) Парни )) )) помогите, ну правда. только начал разбираться, хочется сделать безопасный логин, а не просто сравнил и погнали ((
Спасибо =) я понимаю каэшн это стебно Название: Cookie Отправлено: CTAPbIu_MABP от 23 Ноябрь, 2009, 08:06:54 igrayka, я думал ты девачка...
Название: Cookie Отправлено: NRG от 23 Ноябрь, 2009, 08:07:05 уважаемый igrayka, воспользуйтесь пожалуйста поиском по форуму(благо что он у нас есть и работает даже неплохо)
вы не первый кто пытается решить подобную проблему, прочитайте внимательно статью автором которой является md5 спасибо, удачи. Название: Cookie Отправлено: CTAPbIu_MABP от 23 Ноябрь, 2009, 08:08:38 Text <form method="POST">Название: Cookie Отправлено: LIFF от 24 Ноябрь, 2009, 10:00:37 igrayka,
Прочитай первый пост в этой теме, относительно пути установки куки. Может в этом твоя проблема. Название: Cookie Отправлено: adw0rd от 25 Ноябрь, 2009, 11:30:10
в SQL запросе есть конструкция "INET_NTOA(user_ip)", ее надо заменить на "INET_NTOA(user_ip) as user_ip", потомучто потом идет обращение "$userdata['user_ip']", а MySQL вернет не "user_ip", а "INET_NTOA(user_ip)" Спустя 1 минуту 49 секунд добавил И так как вы вытаскиваете еще все ("SELECT *,"), то у вас там есть уже user_ip, но он не тот, который вам нуженвам надо после вызвать и разобраться что у вас есть в выводе |