Работа с сессиями.

Часто между запросами нужно хранить какие-то данные о пользователе, но http протокол не предусматривает состояний, зато есть другие возможности. Самое главное как-то узнать пользователя, это можно сделать модифицируя строку запроса, допустим, добавив гет переменную site.my/index.php?page=index&user=123456. Вариант не очень красивый и главное опасный, т.к. идентификатор может уйти с сылкой другу. Второй вариант — воспользоваться куками, это данные, которые наш браузер посылает на сервер при каждом запросе. Дальше можно либо воспользоваться своим обработчиком, либо использовать готовый обработкик — сессии.

Для работы с сессиями достаточно вызвать session_start() до вывода чего-либо в браузер, после этого становится доступен суперглобальный массив $_SESSION, в котором и хранится информация. Важно. Идентификатор сессии может передаваться через get, post и cookie. Get и post данные являются легко изменяемыми, например пользователю подсунули ссылку с идентификатором или заставили залогиниться через поддельную форму с другого сайта, после чего злоумышленнику доступен идентификатор сессии. Для получения идентификатора из куки в ини файле. session.use_trans_sid = 0 – в целях безопасность отключаем. session.use_cookies = 1 – разрешаем использовать куки. session.use_only_cookies = 1 – используем только куки, опция отключена по умолчанию.

Теперь немного о процессе, который происходит внутри. Сервер получает идентификатор, если он есть, имя которого можно получить-изменить с помощью session_name(), по умолчанию (session.name = PHPSESSID). Механизм сессий весьма гибок и позволяет менять обработчик сессии, для этого существует session_set_save_handler().

Вначале вызывается обработчик для работы сессии на файлах  (session.save_handler = files). Если пришёл идентификатор, то восстанавливается старая сессия, если его нет, стартует новая, для этого посылается заголовок для установки куки. Данные по умолчанию хранятся в файле, который находится в директории session_save_path() и имеет имя sess_ИДЕНТИФИКАТОР, желаельно изменять значение в php.ini session.save_path или с помощью set-get функции session_save_path. Так как он хранится в плоском файле, для записи-чтения его нужно сериализировать-десериализовать, опять же для гибкости можно менять обработчик (session.serialize_handler = php), этот процесс проходит в начале работы с сессией и по завершению работы скрипта, даже если он завершился по таймауту.

При вызове session_start() вызывается open, затем read, который открывает файл сессии, десериализует данные и возвращает их в  суперглобальную переменную $_SESSION, при этом данные покоторые записывали туда до старта естественно перезаписываются.

При окончании работы скрипта или при вызове session_write_close(), данные сериализируются и записываются, очень полезно для тяжёлых скриптов самостоятельно закрывать сессию, тем самым освобождая файл для следующих запросов.

Метод close вызывается в конце работы. Метод destroy, нужен для уничтожения сессии, впринципе он только чистит куку не удаляя сам файл, поэтому желательно вызывать $_SESSION = array(); session_destroy(); Стоит отметить gc, который нужен для уборки мусора он вызывается с частотой session.gc_probability/session.gc_divisor.

Но самая большая вкусность — это изменение обработчика сессиий, например на хранение в ДБ или memcache.

Работа с сессиями.: 1 комментарий

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *