Cookie в PHP основы работы


Оглавление (нажмите, чтобы открыть):

Глава 13. Cookies и отслеживание сеанса в PHP

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

Если отвлечься от проблем конфиденциальности, отслеживание пользовательских данных с применением cookie или других средств приносит огромную пользу как пользователю, так и сайту, обеспечивающему эти возможности. Пользователь выигрывает от того, что содержание сайта настраивается в соответствии с его личными предпочтениями, а из сайта исключается бесполезная или не представляющая интереса информация. Для администратора сайта отслеживание пользовательских предпочтений открывает совершенно новый уровень взаимодействия с пользователем, включая возможности целевого маркетинга и анализа популярности материалов сайта. В Web, где сейчас преобладает электронная коммерция, эти возможности стали практически стандартными.

Концепция «наблюдения» за пользователем в процессе перемещения по сайту обычно называется «отслеживанием сеанса» (session tracking). Принимая во внимание огромный объем полезной информации, получаемой в результате отслеживания сеанса на сайте, можно сказать, что преимущества отслеживания сеансов и персональной настройки содержания сайта значительно превышают любые недостатки. Вряд ли эту книгу можно было бы считать полноценным учебником по PHP, если бы я не посвятил в ней целую главу средствам отслеживания сеанса в PHP. В этой главе мы рассмотрим некоторые концепции, имеющие непосредственное отношение к отслеживанию сеансов, а именно — cookie и их применение, а также уникальные идентификаторы сеансов. Глава завершается сводкой стандартных функций PHP, предназначенных для отслеживания сеансов.

Что такое cookie?

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

Вследствие того, что cookie обычно связываются с конкретным пользователем, в них часто сохраняется уникальный идентификатор пользователя (UIN). Этот идентификатор заносится в базу данных на сервере и используется в качестве ключа для выборки из базы всей информации, связанной с этим идентификатором. Конечно, сохранение UIN в cookie не является обязательным требованием; вы можете сохранить любую информацию при условии, что ее общий объем не превосходит 4 Кбайт (4096 байт).

Компоненты cookie

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

  • Имя — имя cookie является обязательным параметром, по которому программа ссылается на cookie. Можно провести аналогию между именем cookie и именем переменной.
  • Значение — фрагмент данных, связанный с именем cookie. В этих данных может храниться любая информация — идентификатор пользователя, цвет фона, текущая дата и т. д.
  • Срок действия — дата, определяющая продолжительность существования cookie. Как только текущая дата и время превосходят заданный срок действия, cookie становится недействительным и перестает использоваться. В соответствии со спецификацией cookie устанавливать срок действия для cookie необязательно. Тем не менее, средства PHP для работы с cookie требуют, чтобы срок действия устанавливался. Согласно спецификации, если срок действия не указан, cookie становится недействительным в конце сеанса (то есть когда пользователь покидает сайт).
  • Домен — домен, который создал cookie и может читать его значение. Если домен состоит из нескольких серверов и доступ к cookie должен быть разрешен всем серверам, то имя домена можно задать в форме .phprecipes.com. В этом случае все потенциальные домены третьего уровня, принадлежащие сайту PHPrecipes (например, wap.phprecipes.com или news.phprecipes.com), смогут работать с cookie. По соображениям безопасности cookie могут устанавливаться только для домена сервера, пытающегося создать cookie. Данный компонент необязателен; если он не указан, по умолчанию используется имя домена, из которого было полу; чено значение cookie.
  • Путь — URL, с которого предоставляется доступ к cookie. Любые попытки получения доступа к cookie за пределами этого пути пресекаются. Данный компонент необязателен; если он не задан, по умолчанию используется путь к документу, создавшему cookie.
  • Безопасность — параметр, показывающий, допускается ли чтение cookie в небезопасной среде. По умолчанию используется значение FALSE.

Хотя при создании cookie используются одни и те же синтаксические правила, формат хранения cookie зависит от браузера. Например, Netscape Communicator хранит cookie в формате следующего вида:

.phprecipes.com FALSE / FALSE 97728956 bgcolor blue

В Internet Explorer то же самое cookie выглядело бы иначе:

Чтобы просмотреть cookie, сохраненные браузером Internet Explorer, достаточно открыть их в любом текстовом редакторе. Помните, что некоторые редакторы не обрабатывают завершающие символы новой строки и на месте этих символов в документе могут выводиться квадратики.

Internet Explorer сохраняет свои cookie в папке с именем «Cookies», a Netscape Communicator использует для этой цели один файл с именем cookies.

Cookie и PHP

Хватит теории. Конечно, вам не терпится поскорее узнать, как задать значение cookie в PHP. Оказывается, очень просто — для этой цели используется стандартная функция setcookie( ).

Функция setcookie( ) сохраняет cookie на компьютере пользователя. Синтаксис функции setcookie( ):

int setcookie (string имя [string значение [, int дата [, string путь [, string домен [, int безопасность]]]]])

Если вы прочитали общие сведения о cookie, то смысл параметров setcookie( ) вам уже известен. Если вы пропустили этот раздел и не знакомы с компонентами cookie, я рекомендую вернуться к началу главы и перечитать его, поскольку все параметры setcookie( ) были описаны выше.

Прежде чем следовать дальше, я попрошу вас перечитать следующую фразу не один и не два, а целых три раза. Значение cookie должно устанавливаться до передачи в браузер любой другой информации, относящейся к странице. Напишите эту фразу 500 раз в тетрадке, сделайте татуировку, научите своего попугая произносить эти слова — короче, проявите фантазию. Другими словами, значение cookie не может устанавливаться в произвольном месте web-страницы. Оно должно быть задано до отправки любых данных в браузер; в противном случае cookie не будет работать.

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

В следующем примере функция setcookie( ) используется для создания cookie с идентификатором пользователя:

$cookie_set = setcookie («uid», $value, time()+3600, «/», «.phprecipes.com», 0);

Последствия создания cookie:

  • После перезагрузки или перехода на другую страницу становится доступной переменная $userid, содержащая идентификатор 4139b31b7bab052.
  • Срок действия cookie истекает ровно через один час (3600 секунд) после отправки. После истечения этого срока cookie становится недействительным.
  • Доступ к cookie разрешен только из домена phprecipes.com.
  • Разрешен доступ к cookie через небезопасный протокол.

В следующем примере (листинг 13.1) cookie используется для хранения параметров форматирования страницы (в данном случае — цвета фона). Обратите внимание: значение cookie задается лишь в результате выполнения действия, установленного для формы.

Листинг 13.1. Сохранение цвета фона, выбранного пользователем

Работа с cookie в PHP

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

Любой веб-сценарий, к примеру, PHP-скрипт, как правило, выполняется доли секунды, возвращая информацию веб-серверу для дальнейшей отправки. После завершения работы сценария все данные, созданные в оперативной памяти в процессе его работы, уничтожаются. Иногда эти данные терять нельзя. Допустим, на главной странице сайта есть HTML-форма с предложением выбрать предпочтительный цвет фона. Далее, на всех страницах используется выбранный пользователем цвет. Значение цвета — это то, что в контексте данной задачи можно хранить при помощи cookie.


Для дальнейшего понимания функционирования механизма cookie в PHP вам необходимо ознакомиться со статьей «Интерпретатор PHP. Основы, принципы функционирования», в особенности, где затрагивается понятие так называемого «первого вывода». Итак, задействовать механизм можно на этапе формирования HTTP-ответа на запрос. Для того, чтобы указать веб-клиенту сохранить у себя какой-то параметр в HTTP-ответ добавляется заголовок Set-Cookie со значением вида name=value (имя параметра, значение параметра), например:

Таких заголовков может быть несколько, если необходимо сохранить более одного параметра. При получении HTTP-ответа веб-браузер проверяет наличие заголовков Set-Cookie и, если таковые имеются, сохраняет их значения в своих внутренних служебных файлах. Куки по умолчанию привязываются к домену сайта. При подготовке HTTP-запроса веб-браузер проверяет, есть ли у него в наличии сохраненные куки, привязанные к домену, к которому выполняется запрос. При наличии в HTTP-запрос добавляется заголовок

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

В куки можно указать время ее жизни. Для этого добавляется специальный атрибут expires следующим образом:

Где date — дата и время, когда браузеру следует удалить данную куки, например:

Обратите внимание на формат атрибута expires.

При помощи атрибута path можно ограничить область действия куки. По умолчанию куки применяются ко всем запросам данного домена, что соответствует значению path=/. Если, допустим, задать path=/doc/, то куки будут применяться только к запросам к директории /doc/, а также всем ее поддиректориям и документам, например, /doc/images/. Пример с атрибутом path:

Можно также переопределить привязку к домену при помощи атрибута domain. По умолчанию куки привязывается к домену документа, запрос которого инициализировал создание куки. Если указать .domain.ru, то куки будет распространяться на запросы к домену domain.ru, а также ко всем его поддоменам. Можно ограничить действие конкретным поддоменом, например www.domain.ru. Пример с использованием атрибутов expires, path и domain:

Настало время разобраться, как работать с куки в PHP. Для установки куки существует PHP-функция setcookie:

Большинство параметров функции необязательные. Разберемся на реальном примере (предложенная ранее страница с выбором цвета фона):

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

Обработчик получает значение выбранного пользователем цвета и сохраняет его в куки при помощи PHP-функции setcookie. Функция setcookie добавит в формирующийся HTTP-ответ заголовок Set-Cookie с нашей куки. Ее, как и функцию header, можно использовать только до вывода, то есть, как можно выше в коде.

Отлично, куки мы сохранили. Теперь нужно их использовать. Над обработчиком добавим код получения значения цвета фона из куки, если оно там хранится:

Все очень просто. Если вместе с запросом скрипта были отправлены какие-либо куки, PHP помещает их в глобальный массив $_COOKIE. Таким образом, работа с принятыми куки ничем не отличается от, скажем, работы с принятыми GET или POST-параметрами. Полный листинг скрипта:

Вникните в работу скрипта, если есть вопросы — welcome в комментарии. Цвет фона сохраняется в так называемую временную куки, которая при закрытии браузера будет удалена. Давайте используем постоянную куки, для этого необходимо в функции setcookie определить третий параметр — время удаления куки, который будет преобразован в атрибут expires HTTP-заголовка Set-Cookie. В параметре указывается отметка времени в Unix формате. Чаще всего для формирования такой отметки используют PHP-функцию time(), которая возвращает текущее время в Unix формате, прибавляя к ней количество секунд, по истечении которых куки должна быть удалена. Например, time()+3600 — удалить куки через час. Сделаем нашу куки активной одну неделю:

Все, теперь выбранный цвет фона сайт «помнит» даже после закрытия браузера. Кстати, чтобы удалить куки достаточно указать в качестве expire прошедшую дату, например time()-3600. Не забывайте просматривать HTTP-заголовки при тестировании примеров.

лабы по информатике, егэ

лабораторные работы и задачи по программированию и информатике, егэ по информатике

PHP занятие 9. Cookie (Куки)

Cookie: создание и параметры

Существуют переменные сессионные (временные) и постоянные. Временные существуют пока открыт браузер, постоянные — пока не истечет срок годности cookie.
Работу сервера и браузера с cookie файлами демонстрирует следующая иллюстрация:

Браузер, посылая запрос на конкретный домен, смотрит, есть ли у него куки для этого домена

Рис. 9.1. Параметры cookie

  1. Имя куки: только латинские буквы, цифры, символ подчеркивания и дефис
  2. Значение параметра
  3. Дата истечения срока годности
  4. Путь, который определяет, в каком месте домена может использоваться файл куки
  5. Домен
  6. Указание, что данные куки должны передаваться посредством безопасного соединения HTTPS

Рис. 9.2. Пример установки cookie

Рис. 9.3. Проверка передачи cookie

  1. Установите переменную для счетчика ($counter), обнулив ее.
  2. Проверьте, установлен ли уже cookie, если да — то присвойте переменной $counter значение cookie (см. пункт 3).
  3. Добавьте cookie для хранения количества посещений.
  4. Приращивайте счетчик.
  5. Проверьте, установлен ли уже cookie, если да — то выводите значение cookie.

Помимо стандартного создания cookie

setcookie(«TestCookie», «Ivan», time()+300);

существует возможность создания массива из разных cookie:

Рис. 9.3. Создание массива из разных cookie

Данное задание также можно выполнить при помощи ассоциативного массива:
Выполнение:

Cookie: удаление

Рис. 9.4. Удаление cookie

При первом запросе страницы cookie.php пользователем, выводить фразу «Добро пожаловать!»

При повторных запросах:

  • Выводить количество посещений. Например: «Вы зашли на страницу 5 раз»
  • Указывать дату и время последнего посещения. Например: «Последнее посещение: 20-08-2009 16:34:45»

    Алгоритм выполнения:

    1. Инициализируйте переменную для подсчета количества посещений
    2. Если соответствующие данные передавались через куки, сохраняйте их в эту
      переменную
    3. Нарастите счетчик посещений
    4. Инициализируйте переменную для хранения значения последнего посещения
      страницы
    5. Если соответствующие данные передавались из куки, отфильтруйте их и сохраните в эту переменную
    6. Установите соответствующие куки (для счетчика и для даты)
    7. Выводите информацию о количестве посещений и дате последнего посещения

    Результат:

    Заголовки. Функция header: переадресация, установка кодировки и др

    • Создать файл header.php с заголовком второго уровня «Здравствуйте!». При помощи директивы header отображать данную страницу в текстовом формате.
    • Использовать на этой же странице директиву для перехода через 5 секунд на какую-либо другую страницу.

    Хэш-функция (шифрование)

    md5(string) — функция шифрования для хранения зашифрованных (хэшированных) данных в базе данных

    setcookie — Посылает cookie

    (PHP 4, PHP 5, PHP 7)

    setcookie — Посылает cookie

    Описание

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

    После передачи клиенту cookie станут доступны через массивы $_COOKIE и $HTTP_COOKIE_VARS при следующей загрузке страницы. Следует иметь в виду, что суперглобальные переменные, такие как $_COOKIE , стали доступны только в PHP 4.1.0. Значения cookie также есть в $_REQUEST .

    Список параметров

    Все аргументы, за исключением name , являются необязательными. Если нужно пропустить какой-либо аргумент, можно вместо него поставить пустую строку ( «»). Это не относится к аргументу expire . Так как он принимает значение типа integer, для его замены пустая строка не подходит. Используйте вместо нее ноль ( 0).

    » RFC 6265 дает конкретные указания, как нужно интерпретировать каждый из параметров setcookie() . name

    Значение cookie. Это значение будет сохранено на клиентском компьютере; не записывайте в cookie секретные данные. Значение присвоенное cookie c именем name , допустим, ‘cookiename’, будет доступно через $_COOKIE[‘cookiename’] .


    Время, когда срок действия cookie истекает. Это метка времени Unix, то есть это количество секунд с начала эпохи. Другими словами, желательно задавать это время с помощью функции time() , прибавляя время в секундах, через которое срок действия cookie должен истечь. Либо можно воспользоваться функцией mktime() . time()+60*60*24*30 установит срок действия cookie 30 дней. Если задать 0 или пропустить этот аргумент, срок действия cookie истечет с окончанием сессии (при закрытии броузера).

    Можно заметить, что expire принимает в качестве значения метку времени Unix, а хранит его в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT. PHP делает внутреннее преобразование автоматически.

    Путь к директории на сервере, из которой будут доступны cookie. Если задать ‘/’, cookie будут доступны во всем домене domain . Если задать ‘/foo/’, cookie будут доступны только из директории /foo/ и всех ее поддиректорий (например, /foo/bar/) домена domain . По умолчанию значением является текущая директория, в которой cookie устанавливается.

    Домен, которому доступны cookie. Задание домена ‘www.example.com’ сделает cookie доступными в поддомене www и поддоменах более высоких порядков. Cookie доступные низким уровням, таким как ‘example.com’, будут доступны во всех поддоменах высших уровней, с том числе ‘www.example.com’. Старые броузеры, следующие устаревшим нормативам » RFC 2109, могут требовать . перед доменом, чтобы включались все поддомены.

    Указывает на то, что значение cookie должно передаваться от клиента по защищенному HTTPS соединению. Если задано TRUE , cookie от клиента будет передано на сервер, только если установлено защищенное соединение. При передаче cookie от сервера клиенту следить за тем, чтобы cookie этого типа передавались по защищенному каналу, должен программист веб-сервера (стоит обратить внимание на $_SERVER[«HTTPS»] ).

    Если задано TRUE , cookie будут доступны только через HTTP протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, вроде JavaScript. Эта возможность была предложена в качестве меры, эффективно снижающей количество краж личных данных посредством XSS атак (несмотря на то, что поддерживается не всеми броузерами). Стоит однако же отметить, что вокруг этой возможности часто возникают споры о ее эффективности и целесообразности. Аргумент добавлен в PHP 5.2.0. Может принимать значения TRUE или FALSE .

    Возвращаемые значения

    Если перед вызовом функции клиенту уже передавался какой-либо вывод (тэги, пустые строки, пробелы, текст и т.п.), setcookie() вызовет отказ и вернет FALSE . Если setcookie() успешно отработает, то вернет TRUE . Это, однако, не означает, что клиентское приложение (броузер) правильно приняло и обработало cookie.

    Примеры

    Ниже представлено несколько примеров, как отправлять cookie:

    Пример #1 Пример использования setcookie()

    setcookie ( «TestCookie» , $value );
    setcookie ( «TestCookie» , $value , time ()+ 3600 ); /* срок действия 1 час */
    setcookie ( «TestCookie» , $value , time ()+ 3600 , «/

    rasmus/» , «example.com» , 1 );
    ?>

    Стоит отметить, что значение cookie перед отправкой клиенту подвергается URL-кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie() (работает в PHP 5). Посмотреть содержимое наших тестовых cookie можно, запустив один из следующих примеров:

    // Вывести одно конкретное значение cookie
    echo $_COOKIE [ «TestCookie» ];
    echo $HTTP_COOKIE_VARS [ «TestCookie» ];

    // В целях тестирования и отладки может пригодиться вывод всех cookie
    print_r ( $_COOKIE );
    ?>

    Пример #2 Пример удаления cookie посредством setcookie()

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

    rasmus/» , «example.com» , 1 );
    ?>

    Пример #3 setcookie() и массивы

    Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:

    // отправка cookie
    setcookie ( «cookie[three]» , «cookiethree» );
    setcookie ( «cookie[two]» , «cookietwo» );
    setcookie ( «cookie[one]» , «cookieone» );

    // после перезагрузки страницы, выведем cookie
    if (isset( $_COOKIE [ ‘cookie’ ])) <
    foreach ( $_COOKIE [ ‘cookie’ ] as $name => $value ) <
    $name = htmlspecialchars ( $name );
    $value = htmlspecialchars ( $value );
    echo » $name : $value
    \n» ;
    >
    >
    ?>

    Результат выполнения данного примера:

    Список изменений

    Версия Описание
    5.5.0 Атрибут Max-Age теперь добавляется в заголовок Set-Cookie, отправляемый клиенту.
    5.2.0 Добавлен параметр httponly .

    Примечания

    Чтобы иметь возможность отправлять вывод скрипта до вызова этой функции, можно воспользоваться буферизацией. В этом случае весь вывод скрипта помещается в буфер на сервере и остается там, пока вы явно не отправите его броузеру. Управление буферизацией осуществляется функциями ob_start() и ob_end_flush() в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.

    Если PHP директива register_globals включена (задано значение on), значения cookie помимо всего прочего будут помещаться в переменные. Для примеров выше будет существовать переменная $TestCookie . Тем не менее, рекомендуется использовать $_COOKIE .

    Общие замечания:

    • Cookie станут видимыми только после перезагрузки страницы, для которой они должны быть видны. Для проверки, правильно ли cookie установились, проверьте их при следующей загрузке страницы до истечения срока их действия. Срок действия cookie задается в параметре expire . Удобно проверять существование cookie простым вызовом print_r($_COOKIE);.
    • При удалении cookie должны быть заданы те же параметры, что и при установке. Если в качестве значения задать пустую строку или FALSE , а остальные параметры задать соответственно предыдущему вызову, установившему cookie, тогда cookie c заданным именем будет удалено с клиентской машины. Внутренне это выглядит так: cookie присваивается значение ‘deleted’, а срок действия переносится на год в прошлое.
    • Так как установка значения FALSE приведет к удалению cookie, не следует задавать cookie значения булевого типа. Вместо этого можно использовать 0 для FALSE и 1 для TRUE .
    • Cookie можно именовать, как массивы, и они будут доступны в PHP скрипте, как массивы, но на пользовательской машине они будут храниться в виде отдельных записей. Для задания cookie c множеством имен и значений желательно использовать функцию explode() . Не рекомендуется для этих целей использовать функцию serialize() , так как это негативно сказывается на безопасности скрипта.

    При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.

    Куки php, cookie


    Cookies (далее просто куки) — это данные небольшого объема (текстовые фрагменты), размещенные на стороне клиента. Куки сохраняются на машине клиента и отправляются веб-серверу с каждым новым запросом.

    Чтобы создать Cookie, необходимо задействовать функцию setcookie() . Данной функции требуется передать следующие параметры:

    Давайте создадим какой-нибудь куки (cookie).

    Вышеописанный cookie обозначает: мы устанавливаем cookie с именем visited . Значение переменной visited – yes (то есть в дальнейшем данный пользователь будет идентифицироваться как – ‘он сайт уже посещал’). Наш куки будет работать в течение месяца (60 * 60 * 24 * 30) . Вы можете видеть, что путь и домен не указаны, поэтому они будут установлены автоматически. Следует отметить: если вы не установите время действия куки, то куки будет действовать в течение текущей сессии. Хотя данный сценарий и установит куки, но сервер не сможет прочитать его, пока пользователь не перезагрузит текущую страницу или не перейдет к другой странице.

    Так как функций setcookie устанавливает HTTP-заголовки, то до вывода данной функции ваш сценарий не должен ничего выводить в браузере, включая пробелы (пробельные символы интерпретируются как HTML-код).

    Чтобы обратиться к куки, можно использовать массив $_COOKIE :

    Чтобы удалить cookie достаточно измените переменную expire следующим образом:

    Куки часто используют в голосованиях: когда пользователь голосует, файл обработчик назначает cookie с информацией о том, что пользователь уже голосовал. Затем при новом заходе на сайт пользователь не имеет возможности голосовать повторно (куки ведь ему уже назначено), хотя такой метод довольно легко обойти.

    Сервер ставит куку

    Браузер передает куку

    Зависит от времени жизни куки

    Заметки (замечания) по кукам

    Куки посылаются туда-сюда в заголовках.

    ‘Туда’ или в браузер кука посылается посредством – setcookie (установили), ‘обратно’ cookie (обратиться к кукам можно посредством массива $_COOKIE ).

    Сессионые(временные) куки: под сессией понимается то время, пока открыт браузер пользователя; как только браузер закроют, сессионная кука удалится. Если в setcookie не указать время — это сессионная кука (пока открыт браузер).

    Куки посылаются в заголовках, поэтому они должны быть до любого вывода.

    Сейчас куки используются в основном для отслеживания посещаемости(то есть не массово) и т.д.

    Следующая сессионая кука считает количество посещения и выводит дату последнего визита.

    Cookies

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

    Любые cookies, отправленные серверу браузером клиента, будут автоматически включены в суперглобальный массив $_COOKIE , если директива variables_order содержит букву «C». Для назначения нескольких значений одной cookie, просто добавьте [] к её имени.

    В старых версиях PHP (5.3 или ранее) опция register_globals могла быть включена, что могло приводить к нежелательным и небезопасным операциям. Если эта опция включена, cookies будут представлены как глобальные переменные.

    Дополнительная информация, в том числе и особенности реализации браузеров, приведена в описании функций setcookie() и setrawcookie() .

    User Contributed Notes 9 notes

    [Editor’s note: Wilson’s comment has been deleted since it didn’t contain much useful information, but this note is preserved although its reference is lost]

    Just a general comment on Wilton’s code snippet: It’s generally considered very bad practice to store usernames and/or passwords in cookies, whether or not they’re obsfucated. Many spyware programs make a point of stealing cookie contents.

    A much better solution would be to either use the PHP built in session handler or create something similar using your own cookie-based session ID. This session ID could be tied to the source IP address or can be timed out as required but since the ID can be expired separately from the authentication criteria the authentication itself is not compromised.

    unset( $_COOKIE [ «cookie» ]);
    ?>

    Apenas apaga um índice de uma variável, os cookies ainda vão existir e continuar a ser enviados do servidor pro cliente e vice-versa.
    Assim como isso:

    [ «cookie» ] = «foo bar» ;
    ?>

    Não cria ou altera o valor do cookie, apenas durante a execução atual, o valor que será passado do servidor pro cliente e vice-versa será o original

    Para excluir ou alterar deve SEMPRE sobre escrever o valor antigo com setcookie(), setrawcookie() ou header(), sendo este último não muito comum e dificilmente terá um uso justificável

    In response to the solution posted in the comment below, there are some practical issues with this solution that must be kept in mind and handled by your code. I developed an application using a similar «use-it-once» key to manage sessions and it worked great but we got some complaints about legitimate users getting logged out without reasons. Turns out the problem was not tentative highjacking, it was either:

    A- Users double click on links or make 2 clicks very fast. The same key is sent for the 2 clicks because the new key from the first click didn’t get to the browser on time for the second one but the session on the server did trash the key for the new one. Thus, the second click causes a termination of the session. (install the LiveHttpHeaders extension on firefox and look at the headers sent when you click twice very fast, you’ll see the same cookie sent on both and the new cookie getting back from the server too late).

    B- For any given reason, the server experiences a slow down and the response with the new key (which has replaced the old one on the server) is not returned to the browser fast enough. The user gets tired of waiting and clicks somewhere else. He gets logged out because this second click send the old key which won’t match the one you have on your server.


    Our solution was to set up a grace period where the old key was still valid (the current key and the previous key were both kept at all times, we used 15 seconds as a grace period where the old key could still be used). This has the drawback of increasing the window of time for a person to highjack the session but if you tie the validity of the old key to an IP address and/or user agent string, you still get pretty good session security with very very few undesired session termination.

    In response to the solution posted in the comment below, there are some practical issues with this solution that must be kept in mind and handled by your code. I developed an application using a similar «use-it-once» key to manage sessions and it worked great but we got some complaints about legitimate users getting logged out without reasons. Turns out the problem was not tentative highjacking, it was either:

    A- Users double click on links or make 2 clicks very fast. The same key is sent for the 2 clicks because the new key from the first click didn’t get to the browser on time for the second one but the session on the server did trash the key for the new one. Thus, the second click causes a termination of the session. (install the LiveHttpHeaders extension on firefox and look at the headers sent when you click twice very fast, you’ll see the same cookie sent on both and the new cookie getting back from the server too late).

    B- For any given reason, the server experiences a slow down and the response with the new key (which has replaced the old one on the server) is not returned to the browser fast enough. The user gets tired of waiting and clicks somewhere else. He gets logged out because this second click send the old key which won’t match the one you have on your server.

    Our solution was to set up a grace period where the old key was still valid (the current key and the previous key were both kept at all times, we used 15 seconds as a grace period where the old key could still be used). This has the drawback of increasing the window of time for a person to highjack the session but if you tie the validity of the old key to an IP address and/or user agent string, you still get pretty good session security with very very few undesired session termination.

    I found a solution for protecting session ID without tying them to client’s IP. Each session ID gives access for only ONE querry. On the next querry, another session ID is generated and stored. If somebody hacks the cookie (or the session ID), the first one of the user and the pirate that will use the cookie will get the second disconnected, because the session ID has been used.

    If the user gets disconnected, he will reconnect : as my policy is not to have more than one session ID for each user (sessions entries have a UNIQUE key on the collomn in which is stored user login), every entries for that user gets wiped, a new session ID is generated and stored on users dirve : the pirate gets disconnected. This lets the pirate usually just a few seconds to act. The slower visitors are browsing, the longer is the time pirates get for hacking. Also, if users forget to explicitly end their sessions . some of my users set timeout longer than 20 minutes !

    IMPORTANT NOTE : This disables the ability of using the back button if you send the session ID via POST or GET.

    If you want a secured session not tied to the client IP you can use the valid-for-one-query method below, but to safeguard against a scenario where the legitimate user clicks twice, you can use a shutdown function (register_shutdown_function)*.

    It will check to see if the script terminated prematurely (connection_aborted), and reset the valid session ID. That way, it’s still valid when the user makes the second request. If the script ends properly, the new session ID will be used instead.

    Now, since you can’t set a cookie from the shutdown function (after output has been sent), the cookie should contain both the previous valid session ID and the new one. Then the server script will determine (on the next request) which one to use.

    :: Pseudo example:
    ::
    :: [Start of script:]
    ::
    :: 1. Get the session ID(s) from cookie
    :: 2. If one of the session ID’s is still valid (that is, if there’s a storage associated with it — in DB, file or whatever)
    :: ____2.1. Open the session
    :: 3. Generate a new session ID
    :: 4. Save the new session ID with the one just used in cookie
    :: 5. Register shutdown function
    ::
    :: [End of script (shutdown function):]
    ::
    :: 1. If script ended prematurely
    :: ____1.1. Save session data using the old Session ID
    :: 2. Else
    :: ____2.1. Save session data using the new Session ID
    :: ____2.2. Make sure the old session ID is added to a list of ID’s (used for the purpose described below)
    :: ____2.3. Trash the old session storage

    There’s still the possibility of some deviant network sniffer catching the session cookie as it’s sent to the client, and using it before the client gets the chance to. Thus, successfully hijacking the session.

    If an old session ID is used, we must assume the session has been hijacked. Then the client could be asked to input his/her password before data is sent back. Now, since we have to assume that only the legitimate user has the password we won’t send back any data until a password is sent from one request.

    And finally, (as a sidenote) we could obscure the login details (if the client has support for javascript) by catching the form as it is sent, take the current timestamp and add it to the form in a dynamically generated hidden form object, replace the password field with a new password that is the MD5 (or similar) of the timestamp and the real password. On the serverside, the script will take the timestamp, look at the user’s real password and make the proper MD5. If they match, good, if not, got him! (This will of course only work when we have a user with a session that’s previously logged in, since we know what password (s)he’s supposed to have.) If the user credentials are saved as md5(username+password), simply ask for both the username and password, md5 them and then md5 the timestamp and the user cred.

    * You could use session_set_save_handler and make sure the session ID is generated in the open function. I haven’t done that so I can’t make any comments on it yet.

    Учимся работать с cookie в PHP

    В сегодняшнем уроке мы поговорим о работе с cookie в PHP. Начнём с того, что же это такое, для чего это нужно и почему оно вообще появилось.

    Как мы с вами уже знаем, в PHP мы можем работать с GET- и POST-запросами. Они позволяют нам передавать серверу данные, чтобы как-то повлиять на работу кода. Мы можем передать скрипту логин и пароль, он их проверит и разрешит нам доступ к какой-либо информации. Однако, это не позволит создать сессию между нами и сервером. То есть сервер не может нас «запомнить», и каждый раз, как мы хотим сказать что это мы, придется отправлять отдельный новый запрос с логином и паролем.

    Для чего нужны cookie

    В качестве решения придумали cookie. Это такие записи с типом ключ-значение, типа массива в PHP, только хранятся они в браузере у пользователя сайта. Для каждого сайта cookie хранятся отдельно. Каждый раз, когда пользователь обращается с запросом на сайт, браузер проверяет наличие этих записей для данного сайта. И если они имеются, то он отправляет их в заголовке каждого запроса к этому сайту.

    Откуда берутся cookie

    Cookie создаются в браузере по «просьбе» сервера. В какой-то момент мы решаем, что нужно в браузере посетителя создать cookie с каким-то значением. Для этого нужно чтобы сервер передал в ответе клиенту специальный заголовок, в котором указано, какую запись нужно создать в браузере для данного сайта.

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

    То есть сервер примерно говорит: «Эй, браузер, создай запись для меня с ключом “login” и значением “admin”, и ещё одну с ключом “password” и значением “123”». После этого браузер при любом запросе к серверу начинает отправлять дополнительные данные типа:

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

    То есть, например, на странице с формой авторизации при верном логине и пароле будем устанавливать cookie, а на остальных страницах уже проверять данные из cookie, переданные клиентом.

    Про время жизни

    При этом у cookie есть TTL (Time To Live – время жизни). То есть эти записи могут быть временными. Это время жизни так же указывается сервером во время установки cookie в браузер. Благодаря этому можно сделать так, чтобы сессия длилась пол часа. А после этого времени пользователю надо будет авторизоваться снова. Наверняка вы замечали это в действии на многих сайтах.

    Как работать с cookie в PHP

    Итак, мы в общих чертах разобрались с тем, как работают cookie. Давайте теперь посмотрим, как с ними можно работать в языке PHP.

    Давайте создадим в нашем проекте файл с именем viewCookies.php. Поместим в него следующий код.

    Как вы уже должны были догадаться, $_COOKIE — это еще один глобальный массив в PHP, аналогично массивам $_GET и $_POST. Только в нём хранятся все cookie, которые были отправлены браузером в рамках текущего запроса.


    Давайте посмотрим на работу данного скрипта, открыв в браузере страницу: http://myproject.loc/viewCookies.php

    Как мы видим, в данный момент этот массив пуст. Давайте же его наполним 🙂 Для этого нам нужно установить какую-нибудь cookie в браузер. В PHP для этого используется функция setcookie($name, $value, $ttl, $path)

    Параметры функции setcookie()

    Имя параметра Предполагаемый тип Значение
    name string Имя cookie-файла (аналогичное имени переменной)
    value string Значение, которое должно быть сохранено в cookie-файле (аналогично значению, которое должно было быть присвоено переменной). Если этот параметр не задан, то cookie-файл, указанный в качестве первого параметра, удаляется
    expire int Значение, определяющее, когда должен истечь срок существования данного cookie-файла. Значение 0 (применяемое по умолчанию) указывает, что cookie-файл должен существовать до закрытия программы браузера. Любое другое целое число интерпретируется как абсолютное значение времени в секундах, когда cookie-файл должен стать недействительным
    path string Путь в адресной строке. Если задать ‘/’, cookie будут доступны из всех директорий сайта. Например, и в http://myproject.loc/ и в http://myproject.loc/posts/. Если задать ‘/posts/’, cookie будут доступны только из директории http://myproject.loc/posts/ и всех ее поддиректорий (например, http://myproject.loc/posts/new/). По умолчанию значением является текущая директория, в которой cookie устанавливается. Если мы хотим, чтобы cookie была доступна на всём сайте, то нужно устанавливать это значение в ‘/’. В обозначении пути должна обязательно присутствовать заключительная косая черта
    httponly bool Cookie-файлы, заданные с этим флагом, передаются только с помощью запросов протокола HTTP. Значением по умолчанию является FALSE
    domain string В случае, предусматриваемом по умолчанию, проверка домена, доступа к которому требует клиент, не производится. Если же данный параметр не пуст, то имя домена должно совпадать с ним. Например, если один и тот же сервер обслуживает домены www.mysite.com и forum.mysite.com, то в коде одного сайта можно обеспечить, чтобы на другом сайте не считывались (и не устанавливались) его cookie-файлы, присвоив параметру domain значение ‘forum.mysite.com’.
    secure bool Значением по умолчанию является 0 (false). Если этот параметр равен 1, или true, то cookie-файл будет передаваться только через соединение с защищенным сокетом (иначе говоря, по протоколу SSL или HTTPS). Обратите внимание на то, что установка такого cookie-файла возможна только при условии, что защищенное соединение уже открыто

    Есть еще несколько параметров, о них вы можете прочитать в официальной документации.

    А теперь давайте попробуем эту функцию в деле. Создадим файл setCookies.php и запишем в него следующий код:

    После этого перейдём по адресу http://myproject.loc/setCookies.php, где увидим пустую страницу. Как мы уже говорили, работа с cookie не видна пользователю.

    Однако, эту работу всегда можно увидеть в консоли разработчика Google Chrome. Давайте откроем её (нажатием F12), перейдём во вкладку Network, обновим страницу в браузере и найдём её в списке загруженных данных (она там одна).

    Нажмем на эту запись и в открывшемся справа окне выберем вкладку Headers. Здесь, в секции Response Headers мы можем видеть заголовок Set-Cookie с указанными нами данными.

    Таким образом, cookie были успешно установлены в браузере. Давайте теперь перейдём на нашу страничку, выводящую массив $_COOKIE — http://myproject.loc/viewCookies.php

    Как мы видим, теперь на сервер передаются cookie, ранее установленные в браузере. Увидеть их можно и в запросе, посмотрев в консоли разработчика секцию Request Headers.

    Если вам нужно посмотреть все cookie, которые имеются в браузере для данного сайта — можно посмотреть их в той же консоли разработчика Google Chrome. Для этого перейдем во вкладку Application, выберем в левом списке пункт Cookies, а внутри него наш сайт.

    Все cookie будут представлены в виде удобного списка.

    Что еще нужно знать про cookie

    И в заключение данного урока нужно добавить, что cookie устанавливаются с помощью заголовка в ответе сервера по протоколу HTTP. Протокол HTTP устроен таким образом, что заголовок должен всегда идти перед данными, и никак иначе. Таким образом, функция setcookie и любые другие функции в PHP, изменяющие заголовок в HTTP-ответе, должны вызываться до любого вывода данных.

    Можно сначала задать cookie, а затем вывести текст.

    Всё прекрасно отработает.

    Но нельзя вывести текст (являющийся телом HTTP-ответа), а затем пытаться установить cookie.

    Как мы видим, это приведет к ошибке. Так устроен протокол HTTP. Сначала — заголовок, затем — тело. Только так и никак иначе.

    Установка нескольких cookie

    Нет ничего проще, чем установить несколько cookie. Для этого нужно просто несколько раз вызвать функцию setcookie.

    Они успешно будут переданы клиенту.

    Удаление cookie-файлов

    Задача удаления cookie-файла решается просто. Достаточно вызвать функцию setcookie() точно с такими же параметрами, как и при установке cookie-файла, за исключением самого значения, которое должно быть задано в виде пустой строки. Такой вызов не приводит к тому, что устанавливается cookie-файл со значением, равным пустой строке, а фактически влечет за собой удаление cookie-файла. Следует учитывать, что, если при установке cookie-файла использовались параметры с указанием пути или домена, эти параметры необходимо также применять для отмены установки cookie-файла. Еще один метод удаления cookie-файлов состоит в том, чтобы задавать время истечения срока хранения в прошлом.

    Пример полноценного взаимодействия с пользователем через cookie мы рассмотрим в следующем уроке. А пока — за домашку.

    PHP — cookie (файлы куки)

    Дата публикации: 2020-10-18

    От автора: в PHP cookie — это текстовые файлы, хранящиеся на компьютере клиента, они сохраняются в целях отслеживания. PHP прозрачно поддерживает HTTP-файлы cookie.

    Для идентификации возвращающихся пользователей предусмотрено три этапа:

    Файл на сервере отправляет набор файлов cookie в браузер. Например, имя, возраст или идентификационный номер и т. д.

    Браузер сохраняет эту информацию на локальном компьютере для будущего использования.

    Когда в следующий раз браузер отправляет любой запрос к веб-серверу, он отправляет эти файлы cookie на сервер, и сервер использует эту информацию для идентификации пользователя.

    Как создать сайт самому?


    Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

    В этой статье мы расскажем, как устанавливать файлы cookie, как работать с ними и как их удалять.

    Принцип работы файлов cookie

    Файлы cookie обычно устанавливаются в HTTP-заголовке (хотя через JavaScript также можно устанавливать cookie непосредственно в браузере). PHP-скрипт, который устанавливает cookie, может отправлять заголовки, выглядящие приблизительно таким образом:

    Как вы можете видеть, заголовок Set-Cookie содержит пару значений имени, дату GMT, путь и домен. Имя и значение будут закодированы в URL-адресе. Поле expires — это инструкция для браузера — «забыть» cookie по истечении заданного времени и даты.

    Если браузер настроен для хранения файлов cookie, он будет хранить эту информацию до истечения срока действия. Если пользователь переходит в браузере на любую страницу, которая соответствует пути и домену файла cookie, браузер отправит cookie на сервер. Заголовки браузера могут выглядеть примерно так:

    После этого скрипт PHP получает доступ к файлу cookie в переменных среды $_COOKIE или $HTTP_COOKIE_VARS[], которые содержат все имена и значения файлов cookie. Сookie можно получить, используя $HTTP_COOKIE_VARS[«name»].

    Настройка файлов cookie с помощью PHP

    PHP предоставляет для установки файла cookie функцию setcookie(). Для этой функции требуется до шести аргументов, и она должна вызываться до тега html. Для каждого файла cookie эту функцию нужно вызывать отдельно.

    Описание всех аргументов —

    name — устанавливает имя файла cookie и хранится в переменной среды с именем HTTP_COOKIE_VARS. Эта переменная используется для доступа к файлам cookie.

    Как создать сайт самому?

    Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

    value — устанавливает значение именованной переменной и представляет собой контент, который вы действительно хотите сохранить.

    expiry — определяет время хранения cookie в секундах с 00:00:00 по Гринвичу 1 января 1970 года. По истечении этого времени cookie станет недоступным. Файлы cookie удаляются после закрытия браузера.

    path — Указывает каталоги, для которых действителен файл cookie. Одиночный символ прямой косой черты задает, что файл cookie является действительным для всех каталогов.

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

    security. Может быть установлено 1, чтобы указать, что файл cookie должен передаваться только через защищенное соединение HTTPS. В противном случае это значение равно 0, и это означает, что файл cookie может передаваться через обычное соединение HTTP.

    В следующем примере мы зададим для cookie name и age, согласно которому эти файлы cookie станут не действительны через час.

    Учимся работать с cookie в PHP

    В сегодняшнем уроке мы поговорим о работе с cookie в PHP. Начнём с того, что же это такое, для чего это нужно и почему оно вообще появилось.

    Как мы с вами уже знаем, в PHP мы можем работать с GET- и POST-запросами. Они позволяют нам передавать серверу данные, чтобы как-то повлиять на работу кода. Мы можем передать скрипту логин и пароль, он их проверит и разрешит нам доступ к какой-либо информации. Однако, это не позволит создать сессию между нами и сервером. То есть сервер не может нас «запомнить», и каждый раз, как мы хотим сказать что это мы, придется отправлять отдельный новый запрос с логином и паролем.

    Для чего нужны cookie

    В качестве решения придумали cookie. Это такие записи с типом ключ-значение, типа массива в PHP, только хранятся они в браузере у пользователя сайта. Для каждого сайта cookie хранятся отдельно. Каждый раз, когда пользователь обращается с запросом на сайт, браузер проверяет наличие этих записей для данного сайта. И если они имеются, то он отправляет их в заголовке каждого запроса к этому сайту.

    Откуда берутся cookie

    Cookie создаются в браузере по «просьбе» сервера. В какой-то момент мы решаем, что нужно в браузере посетителя создать cookie с каким-то значением. Для этого нужно чтобы сервер передал в ответе клиенту специальный заголовок, в котором указано, какую запись нужно создать в браузере для данного сайта.

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

    То есть сервер примерно говорит: «Эй, браузер, создай запись для меня с ключом “login” и значением “admin”, и ещё одну с ключом “password” и значением “123”». После этого браузер при любом запросе к серверу начинает отправлять дополнительные данные типа:

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

    То есть, например, на странице с формой авторизации при верном логине и пароле будем устанавливать cookie, а на остальных страницах уже проверять данные из cookie, переданные клиентом.

    Про время жизни

    При этом у cookie есть TTL (Time To Live – время жизни). То есть эти записи могут быть временными. Это время жизни так же указывается сервером во время установки cookie в браузер. Благодаря этому можно сделать так, чтобы сессия длилась пол часа. А после этого времени пользователю надо будет авторизоваться снова. Наверняка вы замечали это в действии на многих сайтах.

    Как работать с cookie в PHP


    Итак, мы в общих чертах разобрались с тем, как работают cookie. Давайте теперь посмотрим, как с ними можно работать в языке PHP.

    Давайте создадим в нашем проекте файл с именем viewCookies.php. Поместим в него следующий код.

    Как вы уже должны были догадаться, $_COOKIE — это еще один глобальный массив в PHP, аналогично массивам $_GET и $_POST. Только в нём хранятся все cookie, которые были отправлены браузером в рамках текущего запроса.

    Давайте посмотрим на работу данного скрипта, открыв в браузере страницу: http://myproject.loc/viewCookies.php

    Как мы видим, в данный момент этот массив пуст. Давайте же его наполним 🙂 Для этого нам нужно установить какую-нибудь cookie в браузер. В PHP для этого используется функция setcookie($name, $value, $ttl, $path)

    Параметры функции setcookie()

    Имя параметра Предполагаемый тип Значение
    name string Имя cookie-файла (аналогичное имени переменной)
    value string Значение, которое должно быть сохранено в cookie-файле (аналогично значению, которое должно было быть присвоено переменной). Если этот параметр не задан, то cookie-файл, указанный в качестве первого параметра, удаляется
    expire int Значение, определяющее, когда должен истечь срок существования данного cookie-файла. Значение 0 (применяемое по умолчанию) указывает, что cookie-файл должен существовать до закрытия программы браузера. Любое другое целое число интерпретируется как абсолютное значение времени в секундах, когда cookie-файл должен стать недействительным
    path string Путь в адресной строке. Если задать ‘/’, cookie будут доступны из всех директорий сайта. Например, и в http://myproject.loc/ и в http://myproject.loc/posts/. Если задать ‘/posts/’, cookie будут доступны только из директории http://myproject.loc/posts/ и всех ее поддиректорий (например, http://myproject.loc/posts/new/). По умолчанию значением является текущая директория, в которой cookie устанавливается. Если мы хотим, чтобы cookie была доступна на всём сайте, то нужно устанавливать это значение в ‘/’. В обозначении пути должна обязательно присутствовать заключительная косая черта
    httponly bool Cookie-файлы, заданные с этим флагом, передаются только с помощью запросов протокола HTTP. Значением по умолчанию является FALSE
    domain string В случае, предусматриваемом по умолчанию, проверка домена, доступа к которому требует клиент, не производится. Если же данный параметр не пуст, то имя домена должно совпадать с ним. Например, если один и тот же сервер обслуживает домены www.mysite.com и forum.mysite.com, то в коде одного сайта можно обеспечить, чтобы на другом сайте не считывались (и не устанавливались) его cookie-файлы, присвоив параметру domain значение ‘forum.mysite.com’.
    secure bool Значением по умолчанию является 0 (false). Если этот параметр равен 1, или true, то cookie-файл будет передаваться только через соединение с защищенным сокетом (иначе говоря, по протоколу SSL или HTTPS). Обратите внимание на то, что установка такого cookie-файла возможна только при условии, что защищенное соединение уже открыто

    Есть еще несколько параметров, о них вы можете прочитать в официальной документации.

    А теперь давайте попробуем эту функцию в деле. Создадим файл setCookies.php и запишем в него следующий код:

    После этого перейдём по адресу http://myproject.loc/setCookies.php, где увидим пустую страницу. Как мы уже говорили, работа с cookie не видна пользователю.

    Однако, эту работу всегда можно увидеть в консоли разработчика Google Chrome. Давайте откроем её (нажатием F12), перейдём во вкладку Network, обновим страницу в браузере и найдём её в списке загруженных данных (она там одна).

    Нажмем на эту запись и в открывшемся справа окне выберем вкладку Headers. Здесь, в секции Response Headers мы можем видеть заголовок Set-Cookie с указанными нами данными.

    Таким образом, cookie были успешно установлены в браузере. Давайте теперь перейдём на нашу страничку, выводящую массив $_COOKIE — http://myproject.loc/viewCookies.php

    Как мы видим, теперь на сервер передаются cookie, ранее установленные в браузере. Увидеть их можно и в запросе, посмотрев в консоли разработчика секцию Request Headers.

    Если вам нужно посмотреть все cookie, которые имеются в браузере для данного сайта — можно посмотреть их в той же консоли разработчика Google Chrome. Для этого перейдем во вкладку Application, выберем в левом списке пункт Cookies, а внутри него наш сайт.

    Все cookie будут представлены в виде удобного списка.

    Что еще нужно знать про cookie

    И в заключение данного урока нужно добавить, что cookie устанавливаются с помощью заголовка в ответе сервера по протоколу HTTP. Протокол HTTP устроен таким образом, что заголовок должен всегда идти перед данными, и никак иначе. Таким образом, функция setcookie и любые другие функции в PHP, изменяющие заголовок в HTTP-ответе, должны вызываться до любого вывода данных.

    Можно сначала задать cookie, а затем вывести текст.

    Всё прекрасно отработает.

    Но нельзя вывести текст (являющийся телом HTTP-ответа), а затем пытаться установить cookie.

    Как мы видим, это приведет к ошибке. Так устроен протокол HTTP. Сначала — заголовок, затем — тело. Только так и никак иначе.

    Установка нескольких cookie

    Нет ничего проще, чем установить несколько cookie. Для этого нужно просто несколько раз вызвать функцию setcookie.

    Они успешно будут переданы клиенту.

    Удаление cookie-файлов

    Задача удаления cookie-файла решается просто. Достаточно вызвать функцию setcookie() точно с такими же параметрами, как и при установке cookie-файла, за исключением самого значения, которое должно быть задано в виде пустой строки. Такой вызов не приводит к тому, что устанавливается cookie-файл со значением, равным пустой строке, а фактически влечет за собой удаление cookie-файла. Следует учитывать, что, если при установке cookie-файла использовались параметры с указанием пути или домена, эти параметры необходимо также применять для отмены установки cookie-файла. Еще один метод удаления cookie-файлов состоит в том, чтобы задавать время истечения срока хранения в прошлом.

    Пример полноценного взаимодействия с пользователем через cookie мы рассмотрим в следующем уроке. А пока — за домашку.

    Правильный вывод cookies в php [дубликат]

    На данный вопрос уже ответили:

    Написал такой код:

    Проблема в том, что сначала открывается сайт без этих данных куки. Только после обновлении страницы с куками.
    Как делать так, чтобы сразу открылся с куками, без всяких обновлений страниц?

    Отмечен как дубликат участниками tutankhamun, user194374, aleksandr barakin, Pavel Parshin, Grundy 24 фев ’16 в 12:28 .

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

    2 ответа 2

    Функция setcookie() предварительно собирает из своих аргументов строку для HTTP-заголовка Set-Cookie в соответствии с RFC-6265 и в конце делает то же самое, что и конструкция header(‘Set-Cookie’, . ) . Таким образом куки будут переданы браузеру вместе с ответом сервера.

    Массив $_COOKIE заполняется на основе данных HTTP-заголовка Cookie , полученного из запроса браузера.

    Именно поэтому данных о только-что установленных куках нету в массиве $_COOKIE . Причем идея «чтобы сразу открылся с куками» врядли является удачным решением, поскольку нарушает логику работы кук на стороне сервера. Это может принести немалую головную боль при поддержке продукта с таким «решением».

    Если вам нужны данные, которые вы только что записали в куки — берите их из той переменной, которую вы использовали в функции setcookie() . Например можно было бы реализовать это так:

    Мастер Йода рекомендует:  Какую прибыль приносит кибер преступность
  • Добавить комментарий