Cookie (куки, печенье) - это небольшой объем именованных данных(в текстовом виде), сохраняемых браузером и связанных с определенной WEB- страницей или WEB- сайтом. Cookies играют роль памяти веб браузера, чтобы сценарии и программы на стороне сервера могли на одной странице работать с данными, введенными на другой странице, или чтобы браузер мог вспомнить пользовательские параметры или другие переменные состояния, когда возвращается на страницу, посещенную им ранее. Cookies первоначально предназначались для разработки серверных сценариев и на низшем уровне реализованы как расширение протокола Коды состояния HTTP. Методы и структура протокола HTTP. Данные cookie автоматически передаются между веб броузером и веб сервером, так что серверные сценарии могут читать и записывать значения cookie, сохраняемые на стороне клиента.
Cookie описаны в RFC 2965. Cookie файлы рассчитаны на то, чтобы изредка сохранять небольшие объемы данных. Они не являются универсальным средством взаимодействия или механизмом передачи данных, поэтому следует проявлять умеренность при их использовании. Спецификации RFC 2965 рекомендуют производителям браузеров не ограничивать число и размеры сохраняемых cookie файлов. Однако ограничения могут существовать:
Помимо обязательного имени(name) и значения(value) каждый cookie имеет несколько необязательных атрибута, управляющих временем его жизни, видимостью и безопасностью.
Установка значения любого из этих атрибутов(expires, max age) заставляет браузер сохранить cookie в локальном файле, чтобы он мог быть прочитан при следующем посещении пользователем веб страницы. После того как будет достигнута дата окончания действия expires или истечет период max age, браузер автоматически удалит cookie файл.
Хотя cookies отправляются только на серверы домена, для которого они предназначены, веб- страница может подгружать изображения или другие компоненты из других доменов. Cookies, получаемые во время загрузки этих компонентов из других доменов, называются "сторонними".
Рекламные компании используют сторонние куки для отслеживания перемещений пользователя по сайтам. В частности, рекламная компания может отслеживать пользователей на всех сайтах, где установлены их рекламные баннеры. Знание страниц, посещённых пользователем, позволяет менять направленность рекламы в зависимости от предпочтений пользователя.
Создание профиля пользователей рассматривается как потенциальная угроза приватности даже при отслеживании в рамках одного домена, но особенно это актуально при отслеживания на нескольких доменах с использованием сторонних куки. По этой причине в некоторых странах cookies регулируются законодательством.
Спецификация P3P включает возможность для веб-сервера сообщить браузеру о нарушении конфиденциальности, указывая характер собираемой информации и цели сбора. Сюда входит и использование информации, полученной с помощью куки. По спецификации P3P браузер может принимать или отклонять куки согласно пользовательским настройкам или же спросить пользователя.
Рекомендации по созданию cookies- файлов.
Пользователь при помощи JavaScript может изменить cookies- файлы. Более того, существует возможность заменить сессионные куки постоянными. Серверное программное обеспечение должно отслеживать такие попытки. Для этого сервер выдаёт куки на определённый срок и записывает дату окончания куки у себя каждый раз, когда пользователь обращается к серверу. Если куки, присланный браузером, имеет дату действия отличную от той, что хранится на сервере, значит имеет место попытка подмены даты действия куки. Сервер может отреагировать, например, запросив у пользователя повторную авторизацию. Или изначально установить флаг HttpOnly в заголовке Коды состояния HTTP. Методы и структура протокола HTTP Set-Cookie, который делает cookies недоступными для скриптов со стороны клиента.
На сервере обычно хранят время последней активности пользователя. И время действия куки зависит от типа ресурса, например на форумах от 3 дней, до месяца, на админских панелях 1 день.
При начале новой сессии ID (уникальную строку) в файле куки нужно менять каждый раз. Это нужно для безопасности, чтобы другой человек похитив эту ID- строку не мог пользоваться аккаунтом жертвы постоянно. Также строку нужно менять при каждом вводе пользователем логина и пароля.
Cookies могут быть установлены в браузер (или иной другой программе) двумя способами:
Set-Cookie: name=newvalue; expires=date; path=/; domain=.example.com. или Set-Cookie: RMID=732423sdfs73242; expires=Fri, 31 Dec 2010 23:59:59 GMT; path=/; domain=.example.net
Домен и путь говорят браузеру, что cookie должна быть отправлена обратно на сервер при запросах Что такое ссылка URL для указанного домена и пути. Если они не указаны, используются домен и путь запрошенной страницы.
Cookies являются частью Коды состояния HTTP. Методы и структура протокола HTTP- заголовка, поэтому setcookie() должна вызываться до любого вывода данных в браузер. Это то же самое ограничение, которое имеет функция header(). Вы можете использовать функции буферизации вывода, чтобы задержать вывод результатов работы скрипта до того момента, когда будет известно, понадобится ли установка cookies или других заголовков.
Любые cookies, отправленные серверу браузером клиента, будут автоматически включены в суперглобальный массив $_COOKIE, если директива variables_order содержит букву "C".
SetCookie("Name","Value")
Массивы cookies.
setcookie("mycookie1['id']", "value_id"); setcookie("mycookie1['lang']", "value_lang");
Значение cookie не доступно в массиве $_COOKIE в пределах того самого запроса, в котором cookie установлен. Другими словами, функция setcookie() не изменяет значения массива $_COOKIE. Однако при всех последующих запросах каждый установленный ранее cookie помещается в массив $_COOKIE.
setcookie("MyCookie[]", "Test", time()+3600);
if (isset($_COOKIE['lang'])) { print "Кука".$_COOKIE['lang']." существует."; }
Чтобы вывести на печать имена и значения всех cookies, посланных в текущем запросе, выполните цикл по массиву $_COOKIE:
foreach ($_COOKIE as $cookie_name => $cookie_value) { print "$cookie_name = $cookie_value<br>"; }
<?php header("Content-Type: text/html; charset=utf-8"); if ($_COOKIE['my_cook']) { // 1 -ый вариант удаления куки setcookie('my_cook', 'My name is John', time() - 1); // time() - 1 - время жизни куки закончилось одну секунду назад // 2 -ый вариант удаления куки, больше отвечающий рекомендациям // setcookie('my_cook', ''); echo 'Cookie удалена у пользователя' . '<br>'; } else { setcookie('my_cook', 'My name is John', time() + 60 * 60 * 24); echo 'Cookie установлена пользователю.' . '<br>'; } var_dump($_COOKIE); ?>
Иногда, при проверке установленных Cookies можно увидеть переменные с непонятными названиями : _utma, _utmb, _utmc. Эти куки устанавливает Google Analytics. Краткое знакомство с переменными Cookies от Google Analytics
Более подробную информацию о переменных можно узнать в документации Google Analytics.