Cookie « F.A.Q. « Форум (original) (raw)

HTTP-Cookies или Куки — служебная информация, посылаемая веб-сервером на компьютер пользователя, для сохранения в браузере.

По сути, это аналог переменных, которые можно хранить у пользователя. Механизм их установки и получения следующий:

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

Область применения

Первое, что нужно помнить - куки хранятся у клиента и он может делать с ними что хочет. Пользователи Firefox даже не обязаны обладать базовыми техническими знаниями - там куки можно просмотреть и изменить, прямо в меню.

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

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

Подходят они так же для сбора общей усредненной статистики по достаточно большому количеству человек. Например, при отслеживании уникальных пользователей на сайте. Если их около 100 000, то скорее всего, подавляющее большинство не будет отключать или подделывать куки.

Для хранения конфеденциальных данных они не подходят.

Для идентификации пользователей подходят с оговорками. Например, после авторизации вы можете положить пользователю в куку его логин и на следующих страницах идентифицировать его уже по нему. Но ничто (кроме технической грамотности) не помешает человеку зайдя под логином "misha", потом исправить соответствующую куку на "admin". Обычно же, в куку кладут идентификатор сеанса, представляющий собой случайную 32-разрядную строку. Тут уже надежды на то, что пользователь не сможет подобрать чужой идентификатор, значительно выше.

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

Установка кук

В PHP куки устанавливаются функцией setCookie(). Её параметры:

name - имя куки
value - значение. Установка пустой строки, позволяет удалить уже существующую куки.
expire - время (unix-формат) устаревания куки. Установка времени, меньше текущего так же позволяет удалить куку. Обратите внимание, что это именно время устаревания, а не время жизни. Т.е. для установки куку на час следует делать так:


setCookie("cook", "value", time() + 3600); // Правильно
setCookie("cook", "value", 3600); // Не правильно

При указании expire=0, кука считается сессионной, т.е. живет до закрытия окна браузера.
path - каталог, на который распространяется кука. По умолчанию - каталог сценария, который эту куку установил. Здесь таится достаточно распространенная ошибка - в большинстве случаев программист хочет установить куку на весь сайт, но забывая про этот аргумент, ставит её только на каталог, а потом долго ищет ошибку. Нужно указывать четко:

setCookie("cook", "value", 0, "/"); // "/" - корень сайта: устанавливаем на весь сайт

domain - позволяет установить куку на основной домен и поддомены. ".domain.com" распространит ее действие на поддомены данного домена. Надеюсь, все понимают, что поставить такую куку можно только с одного из этих поддоменов. Так же не старайтесь поставить её на домен первого уровня, например, ".ru" :)
secure - запрещяет передавать куку по HTTP. Можно только по HTTPS.

Помните, что куки, являются http-заголовками и на них так же распространяется проблема с "Cannot add header information".

Получение кук. Массив $_COOKIE

При запросе страницы, до вызова сценария, PHP формирует массив COOKIE(нарядус_COOKIE (наряду с COOKIE(нарядус_GET, $_POST и др). В него, попадают пришедшие куки, которые можно оттуда получить.

По этому поводу помните следующие вещи:

$_COOKIE заполняется перед стартом сценария. Во время выполнения сценария это обычный массив (разве что суперглобальный).

$_COOKIE['cook1'] = 'value';
unSet($_COOKIE['cook2']);

Имеют смысл только как операции с элементами обычного массива. Никакие куки в браузере клиента от этого не появятся и не удалятся. Устанавливайте и удаляйте куки при помощи setCookie().

setCookie() устанавливает заголовок ответа, который будет послан браузеру. В следующий раз браузер при запросе отправит куку серверу и она будет записана в $_COOKIE при запуске сценария. Искать куку в том же сценарии не имеет смысла:


setCookie("cook", "value");
print $_COOKIE["cook"]; // Не будет её тут