Использование переменных SESSION и cookies

Опубликовал: Saturday, January 5, 2024 в категории AJAX, PHP | Пока нет комментариев

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

HTTP — это протокол "без сохранения состояния", т. е. он не имеет встроенного способа сохранения состояния между двумя транзакциями. Когда пользователь открывает сначала одну страницу сайта, а затем переходит на другую страницу того же сайта, то, основываясь только на средствах, предоставляемых протоколом HTTP, невозможно установить, что оба запроса относятся к одному пользователю. Следо-

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

Переменные session

Этапы при работе с сессиями:

открытие сессии;

регистрация переменных сессии и их использование;

закрытие сессии.

Самый простой способ открытия сессии — вызов функции session_start в начале PHP-сценария:

session_start();

Эта функция проверяет, существует ли идентификатор сессии, и если нет, то создает его. Если идентификатор текущей сессии уже существует, то загружаются зарегистрированные переменные сессии.

После инициализации сессии появляется возможность сохранять информацию в суперглобальном массиве $_SESSION. Пусть имеется файл page1.php, в котором в массив $_SESSION сохраняется переменная (листинг 3.19).

Листинг 3.19

<?php

// Инициируем сессию

session_start();

// Помещаем значение в сессию

$_SESSION[param1] = "123456789";

// Выводим ссылку на другую страницу

echo "<a href=’page2.php’>другая страница</a>";

?>

На страницах, где происходит вызов функции session_start(), значения данных переменных можно извлечь из суперглобального массива $_SESSION. В листинге 3.20 приведено содержимое страницы page2.php, где извлекаются данные, ранее помещенные на странице page1.php.

Листинг 3.20

<?php

// Инициируем сессию

session_start();

// Выводим содержимое переменной $_SESSION[param1] echo "$_SESSION[param1]=". $_SESSION[param1];

?>

После завершения работы с сессией сначала нужно разрегистрировать все переменные сессии, а затем вызвать функцию unset():

unset($_SESSION[param1]);

Переменные cookie

Механизм сookies удобен как для программистов, так и для пользователей. Пользователи выигрывают за счет того, что им не приходится каждый раз заново вводить информацию о себе, а программистам сookies помогают легко и надежно сохранять информацию о пользователях. Cookies — это текстовые строки, хранящиеся на стороне клиента и содержащие пары "имя-значение", с которыми связан URL, по которому браузер определяет, нужно ли посылать cookies на сервер.

Установка cookies производится с помощью функции setcookie. Синтаксис: bool setcookie (string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

Аргументы функции setcookie:

name — имя устанавливаемой переменной cookie;

value — значение, хранящееся в cookie с именем $name;

expire — время в секундах с начала эпохи, по истечении которого текущая переменная cookie становится недействительной;

path — путь, по которому доступна cookie;

domain — домен, из которого доступна cookie;

secure — директива, определяющая, доступна ли переменная cookie не по запросу HTPPS. По умолчанию эта директива имеет нулевое значение, что означает возможность доступа к cookie по обычному запросу HTTP.

В Н И М А Н И Е !

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

Значение, хранящееся в переменной cookie, можно получить через глобальный массив $_COOKIE[]. Поскольку некоторые пользователи отключают cookie в настройках своих браузеров, для корректной работы, в приложение, задействующее cookies, необходимо помещать код, проверяющий, включены ли cookies у посетителя, и если нет, то сообщающий ему о необходимости включить cookie (листинг 3.21).

Листинг 3.21

<?

if(!$cookie)

{

// посылаем заголовок переадресации на страницу,

// с которой будет предпринята попытка установить cookie

header("Location: $PHP_SELF?cookie=1");

// устанавливаем cookie с именем "test" setcookie("test","1");

}

else

{

if(!$test)

{

echo("Необходимо включить cookies");

}

else

{

// cookie включены, переходим на нужную страницу

header("Location: http://localhost/test1.php");

}

}

?>

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

ся предоставлять свои данные вновь при каждом посещении сайта.

Как уже говорилось, срок годности устанавливается в секундах относительно начала эпохи. В PHP существуют функции time и mktime для работы с датой и временем, позволяющие переводить текущее время в число секунд с начала эпохи. Функция time просто переводит текущее системное время в число секунд, прошедших с начала эпохи. Усовершенствованный вариант — функция mktime:

int mktime ([int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]])

Аргумент is_dst определяет, попадает ли эта дата в период летнего времени и может принимать следующие значения:

–1 (по умолчанию; означает, что свойство не задано);

0 (временной интервал не приходится на период летнего времени);

1 (временной интервал приходится на период летнего времени).

Примеры

<?

// этот cookie действителен в течение 20 мин после создания

setcookie("name", $value, time() + 1200);

// действие этого cookie прекращается в полночь 25 января 2011 года

setcookie("name", $value, mktime(0,0,0,01,25,2011));

?>

Удалить переменную cookie просто — нужно вызвать функцию setcookie

и передать ей имя той переменной cookie, которая подлежит удалению:

setcookie("param1");

Другие установленные cookie при этом не удаляются.

Иногда в cookies приходится хранить конфиденциальные данные, и в этом слу-

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

установка области видимости cookies;

шифрование;

ограничение доступа для доменов;

отправка cookies по защищенному запросу.

Наилучшее решение — комплексное применение всех этих способов.

Поскольку, по умолчанию, доступ к cookie происходит из корневого каталога, это может создать "дыры" в системе защиты, т. к. cookies становятся доступными в любом подкаталоге этого каталога. Ограничить доступ к cookies для всех страниц, кроме расположенных в конкретном каталоге, например /catalog, можно следующим образом:

setcookie("name", $value, "/catalog/");

Но при этом каталоги /catalog/index.php, /catalog/page.html и т. д. тоже будут удовлетворять введенному ограничению. Если такое положение нежелательно, можно ограничить область видимости cookies до конкретной страницы:

setcookie("name", $value, "/ catalog /index.php");

Для дополнительной безопасности, список доменов, имеющих доступ к cookies,

должен быть ограничен:

setcookie("param1", $value, "/catalog/index.php", ".site.ru");

При таком ограничении заданной области видимости будут соответствовать домены с именами site.ru, mysite.ru, поскольку проверка на допустимость области видимости домена осуществляется по принципу концевого соответствия.

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

setcookie("param1", $value, time() + 600, "/catalog/", ".site.ru", 1);

Источник: Петин В. А., Сайт на AJAX под ключ. Готовое решение для интернет-магазина. — СПб.: БХВ-Петербург, 2011. — 432 с.: ил. + CD-ROM — (Профессиональное программирование)

Похожие посты:

Комментировать

Your email address will not be published. Required fields are marked *