Модуль Apache mod_session_dbd
| Описание: | Поддержка сеансов на основе DBD/SQL |
|---|---|
| Статус: | Расширение |
| Идентификатор модуля: | session_dbd_module |
| Исходный файл: | mod_session_dbd.c |
| Совместимость: | Доступен в Apache 2.3 и более поздних версиях |
Краткое описание
Предупреждение
Модули сеансов используют HTTP-куки и поэтому могут стать жертвами атак межсайтового скриптинга или раскрыть клиентам потенциально конфиденциальную информацию. Прежде чем включать функциональность сеансов на сервере, убедитесь, что учтены соответствующие риски.
Этот подмодуль mod_session обеспечивает поддержку хранения пользовательских сеансов в базе данных SQL с использованием модуля mod_dbd.
Сеансы могут быть анонимными, когда ключом сеанса служит уникальная строка UUID, хранящаяся в браузере в куки, или пользовательскими, когда ключом сеанса служит идентификатор вошедшего в систему пользователя.
Сеансы на основе SQL скрыты от браузера и поэтому обеспечивают определённую конфиденциальность без необходимости шифрования.
Разные веб-серверы в серверном кластере могут использовать общую базу данных и, таким образом, совместно использовать сеансы.
Дополнительные сведения об интерфейсе сеансов см. в документации модуля mod_session.
Настройка DBD
Прежде чем настроить модуль mod_session_dbd для поддержки сеансов, необходимо настроить модуль mod_dbd, чтобы сделать различные запросы к базе данных доступными серверу.
Для поддержки сеанса требуются четыре запроса: для выбора существующего сеанса, обновления существующего сеанса, добавления нового сеанса и удаления просроченного или пустого сеанса. Эти запросы настраиваются, как показано в примере ниже.
Пример настройки DBD
DBDriver pgsql DBDParams "dbname=apachesession user=apache password=xxxxx host=localhost" DBDPrepareSQL "delete from session where key = %s" deletesession DBDPrepareSQL "update session set value = %s, expiry = %lld, key = %s where key = %s" updatesession DBDPrepareSQL "insert into session (value, expiry, key) values (%s, %lld, %s)" insertsession DBDPrepareSQL "select value from session where key = %s and (expiry = 0 or expiry > %lld)" selectsession DBDPrepareSQL "delete from session where expiry != 0 and expiry < %lld" cleansession
Анонимные сеансы
Ключом анонимных сеансов служит уникальный UUID, который хранится в браузере в HTTP-куки. Этот метод похож на используемый большинством серверов приложений для хранения информации о сеансах.
Чтобы создать простой анонимный сеанс, сохранить его в таблице базы данных postgres с именем apachesession и сохранить идентификатор сеанса в куки с именем session, настройте сеанс следующим образом:
Анонимный сеанс на основе SQL
Session On SessionDBDCookieName session path=/
Другие примеры настройки сеанса для чтения и записи данных CGI-приложением см. в разделе примеров модуля mod_session.
Документацию о том, как использовать сеанс для хранения имени пользователя и пароля, см. в модуле mod_auth_form.
Пользовательские сеансы
Ключом пользовательских сеансов служит имя успешно прошедшего аутентификацию пользователя. Такой способ обеспечивает наибольшую конфиденциальность, поскольку вне области аутентификации не существует внешнего идентификатора сеанса.
Пользовательские сеансы работают в правильно настроенной среде аутентификации, использующей базовую аутентификацию, дайджест-аутентификацию или клиентские сертификаты SSL. Из-за ограничения, связанного с вопросом о том, что появилось раньше — курица или яйцо, пользовательские сеансы нельзя использовать для хранения учётных данных аутентификации из такого модуля, как mod_auth_form.
Чтобы создать простой пользовательский сеанс, сохранить его в таблице базы данных postgres с именем apachesession и использовать идентификатор пользователя в качестве ключа сеанса, настройте сеанс следующим образом:
Пользовательский сеанс на основе SQL
Session On SessionDBDPerUser On
Обслуживание базы данных
Со временем в базе данных могут накапливаться просроченные сеансы. На данный момент модуль mod_session_dbd ещё не умеет автоматически обрабатывать истечение срока действия сеансов.
Предупреждение
Администратору потребуется настроить внешний процесс очистки просроченных сеансов с помощью cron.
Директива SessionDBDCookieName
| Описание: | Имя и атрибуты куки RFC2109, в которой хранится идентификатор сеанса |
|---|---|
| Синтаксис: | SessionDBDCookieName name attributes |
| По умолчанию: | none |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_session_dbd |
Директива SessionDBDCookieName задаёт имя и необязательные атрибуты куки, соответствующей RFC2109, в которой будет храниться идентификатор сеанса. Куки RFC2109 задаются с помощью HTTP-заголовка Set-Cookie.
Можно указать необязательный список атрибутов куки, как показано в примере ниже. Эти атрибуты без изменений добавляются в куки и не интерпретируются Apache. Убедитесь, что атрибуты заданы правильно в соответствии со спецификацией куки.
Куки с атрибутами
Session On SessionDBDCookieName session path=/private;domain=example.com;httponly;secure;version=1;
Директива SessionDBDCookieName2
| Описание: | Имя и атрибуты куки RFC2965, в которой хранится идентификатор сеанса |
|---|---|
| Синтаксис: | SessionDBDCookieName2 name attributes |
| По умолчанию: | none |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_session_dbd |
Директива SessionDBDCookieName2 задаёт имя и необязательные атрибуты куки, соответствующей RFC2965, в которой будет храниться идентификатор сеанса. Куки RFC2965 задаются с помощью HTTP-заголовка Set-Cookie2.
Можно указать необязательный список атрибутов куки, как показано в примере ниже. Эти атрибуты без изменений добавляются в куки и не интерпретируются Apache. Убедитесь, что атрибуты заданы правильно в соответствии со спецификацией куки.
Cookie2 с атрибутами
Session On SessionDBDCookieName2 session path=/private;domain=example.com;httponly;secure;version=1;
Директива SessionDBDCookieRemove
| Описание: | Управление удалением куки с идентификатором сеанса из входящих HTTP-заголовков |
|---|---|
| Синтаксис: | SessionDBDCookieRemove On|Off |
| По умолчанию: | SessionDBDCookieRemove On |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_session_dbd |
Флаг SessionDBDCookieRemove определяет, будут ли куки с идентификатором сеанса удаляться из заголовков при обработке запроса.
В конфигурации с обратным прокси-сервером, когда сервер Apache выступает в роли внешнего сервера для исходного сервера, передача содержимого куки с идентификатором сеанса внутреннему серверу может нарушить конфиденциальность. Если параметр включён, куки с идентификатором сеанса будут удаляться из входящих HTTP-заголовков.
Директива SessionDBDDeleteLabel
| Описание: | SQL-запрос для удаления сеансов из базы данных |
|---|---|
| Синтаксис: | SessionDBDDeleteLabel label |
| По умолчанию: | SessionDBDDeleteLabel deletesession |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_session_dbd |
Директива SessionDBDDeleteLabel задаёт метку запроса удаления по умолчанию, используемого для удаления просроченного или пустого сеанса. Эта метка должна быть предварительно определена с помощью директивы DBDPrepareSQL.
Директива SessionDBDInsertLabel
| Описание: | SQL-запрос для добавления сеансов в базу данных |
|---|---|
| Синтаксис: | SessionDBDInsertLabel label |
| По умолчанию: | SessionDBDInsertLabel insertsession |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_session_dbd |
Директива SessionDBDInsertLabel задаёт метку запроса добавления по умолчанию, используемого для загрузки сеанса. Эта метка должна быть предварительно определена с помощью директивы DBDPrepareSQL.
Если попытка обновить сеанс не затрагивает ни одной строки, этот запрос будет вызван для добавления сеанса в базу данных.
Директива SessionDBDPerUser
| Описание: | Включение пользовательского сеанса |
|---|---|
| Синтаксис: | SessionDBDPerUser On|Off |
| По умолчанию: | SessionDBDPerUser Off |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_session_dbd |
Флаг SessionDBDPerUser включает пользовательский сеанс, ключом которого служит имя пользователя для входа в систему. Если пользователь не вошёл в систему, эта директива игнорируется.
Директива SessionDBDSelectLabel
| Описание: | SQL-запрос для выбора сеансов из базы данных |
|---|---|
| Синтаксис: | SessionDBDSelectLabel label |
| По умолчанию: | SessionDBDSelectLabel selectsession |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_session_dbd |
Директива SessionDBDSelectLabel задаёт метку запроса выборки по умолчанию, используемого для загрузки сеанса. Эта метка должна быть предварительно определена с помощью директивы DBDPrepareSQL.
Директива SessionDBDUpdateLabel
| Описание: | SQL-запрос для обновления существующих сеансов в базе данных |
|---|---|
| Синтаксис: | SessionDBDUpdateLabel label |
| По умолчанию: | SessionDBDUpdateLabel updatesession |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_session_dbd |
Директива SessionDBDUpdateLabel задаёт метку запроса обновления по умолчанию, используемого для загрузки сеанса. Эта метка должна быть предварительно определена с помощью директивы DBDPrepareSQL.
Если попытка обновить сеанс не затрагивает ни одной строки, будет вызван запрос добавления, чтобы добавить сеанс в базу данных. Если база данных поддерживает InsertOrUpdate, переопределите этот запрос, чтобы выполнять обновление одним запросом вместо двух.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_session_dbd.html