Что такое Cookie

Cookie (куки, печенье) - это небольшой объем именованных данных(в текстовом виде), сохраняемых браузером и связанных с определенной WEB- страницей или WEB- сайтом. Cookies играют роль памяти веб браузера, чтобы сценарии и программы на стороне сервера могли на одной странице работать с данными, введенными на другой странице, или чтобы браузер мог вспомнить пользовательские параметры или другие переменные состояния, когда возвращается на страницу, посещенную им ранее. Cookies первоначально предназначались для разработки серверных сценариев и на низшем уровне реализованы как расширение протокола Коды состояния HTTP. Методы и структура протокола HTTP. Данные cookie автоматически передаются между веб броузером и веб сервером, так что серверные сценарии могут читать и записывать значения cookie, сохраняемые на стороне клиента.

Cookie описаны в RFC 2965. Cookie файлы рассчитаны на то, чтобы изредка сохранять небольшие объемы данных. Они не являются универсальным средством взаимодействия или механизмом передачи данных, поэтому следует проявлять умеренность при их использовании. Спецификации RFC 2965 рекомендуют производителям браузеров не ограничивать число и размеры сохраняемых cookie файлов. Однако ограничения могут существовать:

  • Всего куков может быть не более 300 штук (300 пар имя-значение). При превышении лимита самые старые файлы перезаписываются.
  • Размер одной куки не может превышать 4кб. При превышении самые старые байты перезаписываются.
  • От одного домена (второго уровня, включая поддомены) может быть установлено не более 20 куков.
  • Для конкретного сайта будут доступны только те куки, которые им и были установлены.
  • Атрибуты cookie: expire, max age, path, domain и secure.

Помимо обязательного имени(name) и значения(value) каждый cookie имеет несколько необязательных атрибута, управляющих временем его жизни, видимостью и безопасностью.

  • expire - по умолчанию cookies являются временными(сеансовыми) – их значения сохраняются на период сеанса Веб- браузера и теряются при закрытии сеанса пользователем. Чтобы cookie сохранялся после окончания сеанса, необходимо сообщить браузеру, как долго он должен храниться. Изначально для этого использовался атрибут expire, указывающий дату окончания действия cookie. Значение expire (RFC 2616) записывается в формате "Wdy, DD Mon YYYY HH:MM:SS GMT". Если этот атрибут не задан, то cookie хранится в течение одного сеанса, до закрытия браузера.
  • max age - аналогичен атрибуту expires, но срок хранения определяется в секундах (RFC 6265). Значение десятичное не - отрицательное целое число. По истечении заданного времени клиент должен отказаться от куки. Значение ноль означает, что от cookie нужно отказаться немедленно.

Установка значения любого из этих атрибутов(expires, max age) заставляет браузер сохранить cookie в локальном файле, чтобы он мог быть прочитан при следующем посещении пользователем веб страницы. После того как будет достигнута дата окончания действия expires или истечет период max age, браузер автоматически удалит cookie файл.

  • path - задает веб страницы, с которыми связан cookie. По умолчанию cookie связывается с создавшей его веб страницей и доступен этой же странице, а также любой другой странице из того же каталога или любых его подкаталогов. Если, например, веб страница http://www.example.com/catalog/index.html создает cookie, то этот cookie будет также видим страницам http://www.example.com/catalog/order.html и http://www.example.com/catalog/widgets/index.html, но не видим странице http://www.example.com/about.html. Этого правила видимости, принятого по умолчанию, обычно вполне достаточно. Тем не менее иногда значения cookie файла требуется использовать на всем многостраничном веб сайте независимо от того, какая страница создала cookie. Чтобы это можно было сделать, для cookie файла задается значение path(path=/;). Тогда любая страница того же веб сервера, содержащая указанное значение в своем URL, сможет использовать cookie файл.
  • domain - по умолчанию cookies доступны только страницам, загружаемым с того веб сервера, который их установил. Однако большим веб сайтам может потребоваться возможность совместного использования cookies несколькими веб серверами. Если атрибут domain для cookie не установлен, значением по умолчанию будет имя веб сервера, на котором находится страница. Обратите внимание, что нельзя сделать так, чтобы домен cookie файла отличался от домена вашего сервера.
  • secure - это логический атрибут с именем secure, определяющий, как значения cookie файла передаются по сети. По умолчанию cookie не защищен, т. е. передается по обычному незащищенному HTTP соединению. Однако если cookie помечен как защищенный, он передается, только когда обмен между броузером и сервером организован по протоколу HTTPS или другому защищенному протоколу. По умолчанию принимает значение false.
Cookie определяются тройкой параметров имя-домен-путь (name-domain-path). Т.е cookie- файлы с разными путями или доменами являются разными cookie, даже если имеют одинаковые имена. Соответственно, cookie меняется на новое, только если новое cookie имеет те же имя, путь и домен. В остальных случаях новые значения cookie добавляются к старым.

Приватность, сторонние cookie. Рекомендации.

Хотя cookies отправляются только на серверы домена, для которого они предназначены, веб- страница может подгружать изображения или другие компоненты из других доменов. Cookies, получаемые во время загрузки этих компонентов из других доменов, называются "сторонними".

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

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

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

Рекомендации по созданию cookies- файлов.

Пользователь при помощи JavaScript может изменить cookies- файлы. Более того, существует возможность заменить сессионные куки постоянными. Серверное программное обеспечение должно отслеживать такие попытки. Для этого сервер выдаёт куки на определённый срок и записывает дату окончания куки у себя каждый раз, когда пользователь обращается к серверу. Если куки, присланный браузером, имеет дату действия отличную от той, что хранится на сервере, значит имеет место попытка подмены даты действия куки. Сервер может отреагировать, например, запросив у пользователя повторную авторизацию. Или изначально установить флаг HttpOnly в заголовке Коды состояния HTTP. Методы и структура протокола HTTP Set-Cookie, который делает cookies недоступными для скриптов со стороны клиента.

На сервере обычно хранят время последней активности пользователя. И время действия куки зависит от типа ресурса, например на форумах от 3 дней, до месяца, на админских панелях 1 день.

При начале новой сессии ID (уникальную строку) в файле куки нужно менять каждый раз. Это нужно для безопасности, чтобы другой человек похитив эту ID- строку не мог пользоваться аккаунтом жертвы постоянно. Также строку нужно менять при каждом вводе пользователем логина и пароля.

cookie (HTTP и/или JavaScript)

Cookies могут быть установлены в браузер (или иной другой программе) двумя способами:

  1. JavaScript работает с cookie с помощью свойства cookie объекта Document. Проверить включены ли cookies можно через Object Navigator.
  2. при помощи протокола Коды состояния HTTP. Методы и структура протокола HTTP в котором предусмотрены два параметра (заголовка) Set-Cookie(сервер указывает принять куку) и Cookie(ответ браузера). Кроме пары имя/значение(name=newvalue), куки может содержать срок действия, путь и доменное имя. Эти атрибуты должны идти после пары name=newvalue и разделяться точкой с запятой. Например:
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 для указанного домена и пути. Если они не указаны, используются домен и путь запрошенной страницы.

cookie (HTTP и/или PHP)

Cookies являются частью Коды состояния HTTP. Методы и структура протокола HTTP- заголовка, поэтому setcookie() должна вызываться до любого вывода данных в браузер. Это то же самое ограничение, которое имеет функция header(). Вы можете использовать функции буферизации вывода, чтобы задержать вывод результатов работы скрипта до того момента, когда будет известно, понадобится ли установка cookies или других заголовков.

Любые cookies, отправленные серверу браузером клиента, будут автоматически включены в суперглобальный массив $_COOKIE, если директива variables_order содержит букву "C".

Когда браузер посылает cookie обратно на сервер, то он посылает только значение. Невозможно получить доступ к домену, пути, времени истечения срока действия или статусу безопасности cookie через массив $_COOKIE, поскольку броузер не посылает его серверу.
  • Установка. Простая установка
    SetCookie("Name","Value")

    Массивы cookies.

    setcookie("mycookie1['id']", "value_id");
    setcookie("mycookie1['lang']", "value_lang");

    Значение cookie не доступно в массиве $_COOKIE в пределах того самого запроса, в котором cookie установлен. Другими словами, функция setcookie() не изменяет значения массива $_COOKIE. Однако при всех последующих запросах каждый установленный ранее cookie помещается в массив $_COOKIE.

Для назначения нескольких значений одной cookie, добавьте [] к её имени. Например:
setcookie("MyCookie[]", "Test", time()+3600);
Для установки и чтения сложных cookie удобно использовать функции serialize и unserialize.
При успешном завершении функция setcookie() возвращает TRUE. Однако, это не означает, что клиентское приложение (например, браузер) правильно приняло и обработало cookie. То есть по поведению функции setcookie НЕльзя определить включены ли куки в браузере клиента.
  • Чтение.
    if (isset($_COOKIE['lang'])) {
    print "Кука".$_COOKIE['lang']." существует.";
    }

    Чтобы вывести на печать имена и значения всех cookies, посланных в текущем запросе, выполните цикл по массиву $_COOKIE:

    foreach ($_COOKIE as $cookie_name => $cookie_value) {
    print "$cookie_name = $cookie_value<br>";
    }
  • Изменение. Если cookie принимает новое значение при имеющемся уже в браузере cookie с совпадающими параметрами name, domain и path, то старое значение заменяется новым. В остальных случаях новые значения cookie добавляются к старым.
  • Удаление. Нужно указать только имя куки, например SetCookie("Name"). Это приведет к удалению установленной куки с именем "Name" - это официальная рекомендация по удалению куки.
  • Работающий пример удаления и установки куки при помощи PHP:
    <?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, and _utmz

Иногда, при проверке установленных Cookies можно увидеть переменные с непонятными названиями : _utma, _utmb, _utmc. Эти куки устанавливает Google Analytics. Краткое знакомство с переменными Cookies от Google Analytics

  • _utma – выдается при первом посещении сайта.
  • _utmb – переменная отслеживает время посещения сайта. При каждом заходе на страницу отмечает “переход”. Время жизни по умолчанию 30 минут.
  • _utmc – отслеживает закрытие браузера пользователем. Если при повторном заходе кука отсутствует, засчитывается новое посещение, независимо от _utmb
  • _utmz – переменная содержит информацию о переходе на сайт (реферер, реклама, ввод в адресной строке). Время жизни - 6 месяцев
  • _utmv – переменная используется для установки “собственной” пользовательской переменной
  • _utmx – переменная нужна для Website Optimizer. Время жизни у куки _utmx – 2 года.

Более подробную информацию о переменных можно узнать в документации Google Analytics.

PQ VPS сервера в 28+ странах.