Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Управление сессиями в PHP, часть 1: Сессии на основе кук (продолжение)


Автор: V. Nagaradjane
Перевод: А.Панин

Сессии на основе кук

PHP предоставляет реализацию механизма управления сессиями на основе кук. Массив $_SESSION используется для хранения данных сессии. PHP автоматически генерирует идентификаторы сессий и отправляет куки, содержащие эти идентификаторы клиентам. Функции PHP для управления сессиями описаны в таблице ниже.

Таблица 1: Функции PHP для управления сессиями
Функция Предназначение
session_start() Открытие сессии. Если сессия не была открыта ранее, клиенту отправляются куки с идентификатором сессии. Если сессия была открыта ранее, в глобальный массив $_SESSION помещаются данные, с которыми ранее произошла его инициализация.
session_destroy() Закрытие сессии. Из массива $_SESSION убираются ранее находившиеся там данные и куки, хранящие идентификатор сессии у клиента, удаляются.

Стандартный процесс создания сессии начинается с вывода страницы с двумя полями ввода для имени пользователя и пароля. Следующий HTML-код используется для формирования страницы входа в систему (внешний вид этой страницы показан на Рисунке 3):

Страница входа в систему
Рисунок 3: Страница входа в систему

Вход в систему

Имя пользователя и пароль передаются сценарию PHP с именем login.php. Этот сценарий использует глобальную переменную $_POST для получения строк, введенных в поля имени пользователя и пароля. После этого устанавливается соединение с базой данных 'session' и из нее извлекаются соответствующие имени пользователя идентификатор пользователя и пароль. Если имя пользователя обнаруживается, пароль, хранимый в базе данных, сравнивается с паролем, введенным пользователем. Если пароли не совпадают, попытка входа в систему отклоняется. В противном случае осуществляется вход. Ниже представлен код сценария login.php:

В случае, если имя пользователя и пароль корректны, вызывается функция session_start(), которая в свою очередь отправляет куки с идентификатором сессии пользователя клиенту. Данные кук показаны на Рисунке 4. После этого становится возможным доступ к данным с помощью вызовов $_SESSION['username'] или $_SESSION['id'] для получения или сохранения данных сессии. В данном случае в массиве $_SESSION сохраняются имя и идентификатор пользователя.

Куки сессии (PHPSESSID) показаны в списке кук браузера Firefox
Рисунок 4: Куки сессии (PHPSESSID) показаны в списке кук браузера Firefox

Созданный с помощью функции session_start() идентификатор сессии хранится в куках на машине клиента. Вы можете исследовать куки, воспользовавшись пунктами меню Firefox "Правка->Настройки", выбрав вкладку "Приватность" и нажав на ссылку "удалить отдельные куки". После этого будет выведен список кук, отсортированный по имени сервера. В данном случае в качестве имени сервера используется адрес 127.0.0.1 и в качестве имени переменной кук используется строка 'PHPSESSID' - вы можете заметить ее в поле 'Содержимое' ('Content') в области вывода информации. Страница приветствия, показанная после входа в систему, изображена на Рисунке 5.

Страница приветствия, выводящаяся после успешного входа
Рисунок 5: Страница приветствия, выводящаяся после успешного входа

Состояние сессии

После открытия сессии вы можете проверить постоянство значений имени и идентификатора пользователя. Давайте создадим для этого небольшой сценарий с именем status.php. Этот сценарий вызывает функцию session_start(). Так как куки сессии доступны на клиентской машине, при вызове функции session_start() происходит получение идентификатора сессии и загрузка соответствующих переменных сессии вместе с их значениями на стороне сервера. Следовательно, вызов $_SESSION['username'] или $_SESSION['id'] вернет данные, сохраненные в файле сценария login.php. Сценарий status.php выглядит следующим образом:

Этот сценарий проверки состояния доступен при переходе по ссылке с именем "Check Status!" на странице приветствия. Он выводит имя и идентификатор пользователя, полученные из массива данных сессии. Таким образом, выполняется основное требование, предъявляемое к сессиям и заключающееся в постоянстве данных при переходе между различными страницами после входа в систему.

Создание защищенных страниц

Главной целью механизма сессий является создание защищенных страниц. Простой сценарий PHP, приведенный ниже, позволяет защитить изображения от публичного доступа. Файл сценария protectedimage.php вызывает функцию require_once('status.php') в самом начале. С помощью нее происходит однократное исполнение сценария проверки состояния. Сценарий проверки состояния проверяет работоспособность сессии и позволяет выполнение последующих функций в случае действительной сессии, либо прекращает работу сценария в ином случае. Код для защиты изображения показан ниже:

Защищенное изображение, которое выводится после корректного открытия сессии, показано на Рисунке 6, а на Рисунке 7 показана та же самая страница (http://127.0.0.1/protectedimage.php), загруженная без предварительного открытия сессии. Посмотрите на URL в адресной строке браузера на обоих рисунках - страница с одним и тем же URL содержит картинку в случае доступных данных сессии и запрещает доступ к картинке если данные сессии недоступны.

Картинка является защищенным содержимым страницы
Рисунок 6: Картинка является защищенным содержимым страницы

Доступ к защищенному содержимому страницы запрещен если данные сессии недоступны
Рисунок 7: Доступ к защищенному содержимому страницы запрещен если данные сессии недоступны

Завершение сессий

Теперь, когда мы разобрались в том, как осуществляется защита содержимого страниц, самое время рассмотреть операцию закрытия сессии. Операция закрытия сессии реализована в сценарии с именем logout.php. Сценарий вызывает функцию session_destroy(), которая удаляет куки и переменные сессии. Страница завершения сессии показана на Рисунке 8. Сценарий завершения сессии выглядит следующим образом:

Страница завершения сессии
Рисунок 8: Страница завершения сессии

Мы можем проверить, действительно ли сессия завершилась, вызвав файл status.php и узнав в том, доступны ли все еще имя и идентификатор пользователя. Сообщение, приведенное на Рисунке 9, указывает на то, что сессия недействительна. Имя и идентификатор пользователя недоступны после завершения сессии. Следовательно, включение сценария status.php в начало каждой защищенной страницы позволяет быть уверенным в том, что доступ к странице будет возможен только после корректного входа в систему, в противном случае все запросы с данным URL будут завершены в самом начале сценария.

Сообщение о состоянии сессии после ее завершения
Рисунок 9: Сообщение о состоянии сессии после ее завершения

Достоинства и недостатки механизма управления сессиями на основе кук

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

В следующей статье будет описан механизм управления сессиями на стороне сервера с использованием таблиц базы данных.