Реализация cookie-наборов

Как уже говорилось, существует несколько методов использования cookie-наборов в РНР-сценариях. В этом разделе рассматриваются два метода (использование HTML и Р1ТТР). Установка cookie-наборов на клиентской стороне с помощью, например JavaScript, рассматриваться не будет, cookie-наборы посылаются клиенту путем спецификации одного или нескольких заголовков Set-Cookie, когда браузер запрашивает файл у Web-сервера во время выполнения запроса GET или POST. Синтаксис HTTP-заголовка Set-Cookie имеет следующий вид:
Set-Cookie: NAME=VALuE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure (more…)

Tags: , ,

Related posts

DOMAIN_NAME

Обратите внимание, что в качестве значения параметра DOMAIN_NAME используется не просто coggeshall.org, а .coggeshall.org (с ведущей точкой). Это еще одна гарантия от злоупотребления cookie-наборами. Параметр DOMAIN_NAME должен иметь как минимум две точки в имени домена, а в некоторых случаях — и три. Это позволяет предотвратить передачу cookie-наборов с именем домена, такого как . com (который совпадает со всеми доменами, оканчивающимися на .com). Для того чтобы определить, сколько точек нужно указывать в (more…)

Tags: , ,

Related posts

Реализация cookie-наборов в сценариях

Теперь, когда мы познакомились с реализацией cookie-наборов, посмотрим, как применить эти знания для создания cookie-наборов, используемых внутри сценариев.
Наиболее очевидным методом установки cookie-набора в PHP-коде является создание заголовка Set-Cookie с помощью PHP-функции header (), как показано в листинге 6.2.
Листинг 6.2. Установка cookie-набора с использованием функции header ()

header("Set-Cookie: mycookie=myvalue; path=/; domain=.coggeshall.org");

Поскольку эта функция используется для отправки HTTP-заголовков, она должна быть выполнена до пересылки содержимого {например, с помощью операторов echo или print). Хотя это работает, такой метод не может быть рекомендован для установки cookie-наборов с использованием PHP-функций. Чуть позже мы рассмотрим функцию setcookie (), используемую для решения этой задачи.
Второй (и, возможно, менее известный) метод установки cookie-наборов — использование HTMI.-дескрипторов. В частности, HTML-дескриптор <МЕТА> можно использовать для имитации HTTP-заголовков внутри HTML-страницы, применяя атрибуты HTTP-EQUIV и CONTENT. Например, чтобы установить такой же cookie-набор, как в листинге 6.2, можно воспользоваться HTML-кодом, представленным в листинге 6.3.
Листинг 6.3. Установка cookie-набора с использованием HTML-дескриптора <мета>

<МЕТА HTTP-EQUIV-"Set-Cookie"
CONTENT="mycookie=myvalue; path=/; domain=.coggeshall.org">

НА ЗАМЕТКУ -
Дескриптор хорош не только для установки cookie-наборов. Несмотря на то что он зависит от используемого браузера, большинство известных браузеров поддерживают НТТР-э а головки, заключенные в дескриптор <МЕТА>. Например, с помощью HTTP-заголовка Refresh можно перенаправить браузер на новую страницу:
<МЕТА HTTP-EQUIV=11 Refгеsh" CONTENT="0; url=http://www.coggeshall.org">
Третий и возможно наиболее известный метод установки cookie-наборов — использование PHP-функции setcookie (). Функция setcookie [) имеет следующий синтаксис:
setcookie (Sname [,$value [, $expire [, $path [, Sdomain [, $secure] ] ] ] ]);
Эта функция применяется как для создания, так и уничтожения cookie-наборов в клиентском браузере. Как и в случае с отсылкой HTTP-заголовков из РНР-сценария, эта функция должна быть выполнена до отправки клиенту любого содержимого. Перед тем как перейти к исследованию этой функции, вкратце рассмотрим каждый параметр. Для большинства частей назначение каждого параметра такое же, как и у за-головка Set-Cookie, рассмотренного ранее. В частности, Sname представляет имя переменной cookie-набора, Svalue — ее текущее значение, Sexpire — метка времени Unix актуальности cookie-набора, Spath — путь на сервере, для которого создан cookie-набор, Sdoraain — домен, для которого создан cookie-набор, и, наконец, Ssecure — это булевское значение, показывающее, что cookie-набор создан только для защищенного HTTP.
При использовании функции setcookie!) любые необязательные параметры мо-гуг быть при необходимости установлены в NULL. В листинге 6.4 показа пример применения функции setcookie!) для установки cookie-набора, аналогичного приведенному в листинге 6.2.
Листинг 6.4, Использование функции setcookie ()

setcookie("mycookie", "myvalue", NULL, "/", ".coggeshall.org");

Если нужно изменить значение cookie-набора, как в случае, когда мы напрямую работали с заголовком Set-Cookie, нужно убедиться, что значения Spath, Sdomain и Sname функции setcookie!) идентичны первоначально использованным. Для удаления cookie-набора можно использовать небольшую хитрость — задать параметр $value равным NULL (при этом параметры Spath, Sdomain и Sname должны быть установлены должным образом). Пример удаления cookie-набора, установленного в листинге 6.4, представлен в листинге 6.5.
Листинг 6.5. Удаление cookie-набора с использованием функции setcookie ()

setcookie("mycookie", NULL, NULL, ".coggeshall.org");

После того как cookie-набор установлен, он остается неактивным до момента, когда браузер запросит у Web-сервера другой документ. Для получения доступа к значению cookie-набора, полученного от браузера, РНР использует суперглобальный массив S_C0OKIE. Этот массив аналогичен массивам 5GET и $_P0ST за исключением того, что он хранит значения cookie-наборов. Каждый ключ в этом суперглобальном массиве представляет отдельный cookie-набор (имя ключа — это имя переменной cookie-набора) .
Для иллюстрации этого примера выполним обитую задачу и напишем сценарий, определяющий, активен ли cookie-набор на клиентском браузере. Для этого, во-первых, потребуется создать cookie-набор, а потом заставить браузер перезагрузить страницу. Когда браузер перезагрузит страницу, он, если примет этот cookie-набор, немедленно вернет его серверу. Проверив наличие этого cookie-набора при перезагрузке страницы, можно проверить работоспособность cookie-набора.
Единственная хитрость в этом сценарии — определить, был ли установлен cookie-набор или браузер по какой-либо причине его отверг. Для того чтобы дать возможность сценарию определить, был ли установлен cookie-набор, при перенаправлении браузера необходимо использовать параметр GET, как показано в листинге 6.6.

Tags: , ,

Related posts