Сеансы в PHP. Управление сеансами

Что такое управление сеансами

Возможно, вам доводилось слышать, что протокол HTTP называют "протоколом без состояния". Это означает, что данный протокол не имеет встроенного способа поддержки состояния между двумя транзакциями. Если пользователь запрашивает одну страницу, а затем другую, то с помощью HTTP невозможно установить, что оба запроса исходят от одного и того же пользователя.

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

Начиная с четвертой версии, в PHP появились собственные встроенные версии управления сеансами. Подход к управлению сеансами несколько изменился с вводом суперглабальных переменных и использованием суперглобального массива $_SESSION.

Базовая функциональность сеансов

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

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

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

Что такое cookie-набор?

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

Set-Cookie: NAME = VALUE; [expires = DATE;] [path = PATH;] [domain = DOMAIN_NAME;] [secure]

В результате будет создан cookie-набор с именем NAME и значением VALUE. Все остальные параметры являются необязательными. В поле expires задается дата истечения срока cookie-набора. Если дата истечения срока действия не задана, cookie-набор будет постоянно действительным, пока кто-нибудь не удалит его вручную. Два параметра path и domain применяются вместе для определения одного или нескольких URL, к которым относится данный cookie-набор. Ключевое слово secure означает, что cookie-набор не должен пересылаться через простое HTTP-соединение.

Когда браузер соединяется с URL, он сначала просматривает cookie-наборы, хранящиеся на локальной машине. Если какие-либо из них относятся к URL, с которыми установлено соединение, они передаются обратно серверу.

Установка cookie-наборов из PHP

Cookie -наборы в PHP можно установить вручную, воспользовавшись функцией setcookie(). Она имеет следующий прототип:

bool setcookie (string name [ , string value [ , int xpire [ , string path [ , string domain [ , int secure] ] ] ] ] )

Параметры в точности соответствуют параметрам описанного выше заголовка Set-Cookie.

Если cookie-набор установлен как

setcookie ('mycookie', 'value');

то когда пользователь заходит на следующую страницу вашего сайта (или перезагружает текущюю страницу) вы получите доступ к cookie-набору либо через $_COOKIE ['mycookie'], либо через $HTTP_COOKIE_VARS ["mycookie"] или же, если включен режим register_globals, то напрямую через переменную $mycookie.

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

Использование cookie-наборов в сеансах

C cookie-наборами связаны некоторые проблемы: некоторые браузеры не принимают cookie-наборы, кроме того, некоторые пользователи запрещают использование cookie-наборов в браузерах, понимающих cookie. Это одна из причин, по которым в PHP-сеансах используется двойной метод cookie-набоh/URL.

При использовании сеансов нет необходимости устанавливать cookie-наборы вручную. Функции сеанса делают это сами.

Чтобы посмотреть содержимое cookie-набора, установленного текущим сеансом, можно использовать функцию session_get_coocie_params(). Она возвращает массив, содержащий элементы lifetime, path, domain и secure.

Можно воспользоваться также

session_set_cookie_params ($lifetime, $path, $domain [ , $secure] );

для установки параметров cookie-набора сеанса.

Для получения более подробной информации о cookie-наборах следует обратиться к специцикации cookie-наборов, которая доступна на сайте компании Netscape:

http://home.netscape.com/newsref/std/cookie_spec.html

Сохранение идентификатора сеанса

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

Другой метод заключается в добавлении идентификатора сеанса к URL-адресу. Можно сделать так, чтобы идентификатор сеанса добавлялся к URL-адресу автоматически — для этого следует установить директиву session.use_trans_sid в файле php.ini. По умолчанию эта директива отключена.

Можно поступить по другому — вручную встроить идентификатор сеанса в ссылку, чтобы обеспечит его передачу. Идентификатор сеанса будет запомитнаться в константе SID. Для того, чтобы передать его вручную, его потребуется добавить в конец ссылки, аналогично GET^

<a href = "linl.php?<?php echo strip_tags(SID); ?>"></a>

Функция strip_tags() здесь служит для того, чтобы сделать невозможным атаки между сайтами с помощью сценариев.

Похожие материалы по теме:

  1. Cookies и управление сессиями
  2. Сессии и cookie



  • Другие |
назадвверхвперед
Rambler's Top100