ФорумПрограммированиеПыхнуть хотите?F.A.Q. → Cookie

Cookie

  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 3 августа 2007 г. 13:38

    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 (наряду с $_GET, $_POST и др). В него, попадают пришедшие куки, которые можно оттуда получить.

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

    $_COOKIE заполняется перед стартом сценария. Во время выполнения сценария это обычный массив (разве что суперглобальный).
    $_COOKIE['cook1'] = 'value';
    unSet($_COOKIE['cook2']);

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

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

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

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 3 августа 2008 г. 8:58, спустя 365 дней 19 часов 20 минут

    Можно ли в одном и том же запросе совмещать удаление и постановку одной и той же куки? Именно постановку, но с предварительным удалением её же.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2008 г. 9:23, спустя 24 минуты 15 секунд

    pyhtelkin, юбилейную тему поднял :)
    adw/0
  • megabit

    Сообщения: 367 Репутация: N Группа: Кто попало

    Spritz 3 августа 2008 г. 9:25, спустя 2 минуты 25 секунд

    pyhtelkinх еще один некропостер :-)
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2008 г. 9:45, спустя 20 минут 8 секунд

    Алексей, да ладно, он же по делу! Чего сразу некропостер то…?
    adw/0
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2008 г. 9:46, спустя 54 секунды


    Можно ли в одном и том же запросе совмещать удаление и постановку одной и той же куки? Именно постановку, но с предварительным удалением её же.


    покажи как именно
    adw/0
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 3 августа 2008 г. 10:30, спустя 43 минуты 31 секунду

    Хм… куки никак не удалить, кроме как поставить прошедшее время.
    А вот перезаписать, думаю, можно (т.е. фактически новую информацию пишем).
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2008 г. 11:08, спустя 38 минут 41 секунду

    Хм… куки никак не удалить, кроме как поставить прошедшее время.

    KENDO, это и есть удаление куки, так как просроченные куки - удаляются.

    А вот перезаписать, думаю, можно (т.е. фактически новую информацию пишем).

    Переписать их можно без сомнения можно.
    adw/0
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 3 августа 2008 г. 13:36, спустя 2 часа 27 минут 10 секунд

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

    Итак, есть план:
    1) [удалить куку "А"]
    2) [поставить куку "А"]

    В чем и был вопрос, состоятся ли сии события на стороне клиента, и сохранится ли их последовательность?
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2008 г. 13:38, спустя 1 минуту 59 секунд

    pyhtelkin, зачем удалять, если ты ее всерано создаешь? Просто измени ее и все.
    adw/0
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 3 августа 2008 г. 13:46, спустя 8 минут 51 секунду

    Adw0rd, скажем так ….. я встретил ситуацию, при которой последовательность этих действий имеет смысл. Цель - сделать корректный обработчик статуса принятия кук не на основе анализа временных параметров.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2008 г. 14:07, спустя 20 минут 18 секунд

    pyhtelkin,


    xxx: хочу чтобы phpinfo() выводил дату рождения моей любимой!!!
    yyy: а нах это тебе?!?!
    xxx: скажем так ….. я встретил ситуацию, при которой последовательность этих действий имеет смысл.


    Все имена вымышлены, любое совпадение является случайным.
    adw/0
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2008 г. 14:09, спустя 2 минуты 22 секунды

    pyhtelkin, а теперь серьезно.

    * Удалять можно только при помощи изменения времени жизни куки.
    * Да, ты можешь удалить и тут же создать в одном сценарии, но я не проверял. И интересно почему, если у тебя возникла такая ситуация, то ты не проверил можно ли проводить такие операции??
    adw/0
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 3 августа 2008 г. 14:48, спустя 39 минут 15 секунд

    Про как удалять знал. В целом - тоже понятно. Но вот интересно бы услышать еще тех кто проверял.

    А вот стоит ли в механизме проверщика возможности установки кук, делать еще предварительную проверку возможности их установки - тут я не знаю, видимо надо будет посоветоваться. Но т.к. это есть отдельный вопрос, и он несколько другой природы, под него заведем отдельную тему на отдельном форуме, для специалистов других областей. =))
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2008 г. 14:59, спустя 10 минут 17 секунд

    pyhtelkin, больше не курите… вам вредно.

    Куки: (http://www.faqs.org/rfcs/rfc2965 читать "5.3 Implementation Limits")
    20 на домен, 4 кб данных на куку.


    Проверка:
    <?php
    if(isset($_COOKIE['Твое_имя_куки'])) {}
    ?>


    adw/0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!