Apache 模块 mod_session_dbd

Description:基于 DBD/SQL 的会话支持
Status:Extension
Module Identifier:session_dbd_module
Source File:mod_session_dbd.c
Compatibility:在 Apache 2.3 和更高版本中可用

Summary

Warning

会话模块使用 HTTP cookie,因此可能成为跨站点脚本攻击的受害者,或向 Client 端公开潜在的私人信息。在服务器上启用会话功能之前,请确保已考虑到相关风险。

mod_session的此子模块支持使用mod_dbd模块在 SQL 数据库中存储用户会话。

会话可以是“匿名”(其中,该会话由存储在浏览器中 Cookie 中的唯一 UUID 字符串作为关键字),也可以是“每个用户”(其中,该会话针对已登录用户的 userid 进行密钥化)。

基于 SQL 的会话从浏览器中隐藏,因此无需加密即可提供一定程度的隐私。

服务器场中的不同 Web 服务器可能选择共享数据库,因此彼此共享会话。

有关会话界面的更多详细信息,请参阅mod_session模块的文档。

DBD Configuration

在配置mod_session_dbd模块以维护会话之前,必须配置mod_dbd模块以使服务器可以使用各种数据库查询。

需要四个查询来维护会话,选择现有会话,更新现有会话,插入新会话以及删除过期或空会话。这些查询按照以下示例进行配置。

samples 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

Anonymous Sessions

匿名会话针对唯一的 UUID 进行键控,并存储在浏览器中的 HTTP cookie 中。此方法类似于大多数应用程序服务器用于存储会话信息的方法。

要创建一个简单的匿名会话并将其存储在名为 apachesession 的 postgres 数据库表中,并将会话 ID 保存在名为 session 的 cookie 中,请按以下方式配置会话:

基于 SQL 的匿名会话

Session On
SessionDBDCookieName session path=/

有关如何配置会话以从 CGI 应用程序读取和写入会话的更多示例,请参见mod_session示例部分。

有关如何使用会话存储用户名和密码详细信息的文档,请参阅mod_auth_form模块。

每个用户会话

每个用户会话均针对成功通过身份验证的用户的用户名进行锁定。它提供了最大的私密性,因为在经过身份验证的领域之外不存在会话的外部句柄。

每个用户会话都在正确配置的身份验证环境中工作,无论是使用基本身份验证,摘要身份验证还是 SSL Client 端证书。由于先到先得的限制,每个用户会话都不能用于存储来自mod_auth_form之类的模块的身份验证凭据。

要创建一个简单的每用户会话并将其存储在称为 apachesession 的 postgres 数据库表中,并将该会话键入用户 ID,请按以下方式配置该会话:

每个用户会话基于 SQL

Session On
SessionDBDPerUser On

Database Housekeeping

随着时间的推移,可以期望数据库开始累积过期的会话。此时,mod_session_dbd模块尚无法自动处理会话到期。

Warning

Management 员将需要通过 cron 设置外部进程,以清除过期的会话。

SessionDBDCookieName Directive

Description:存储会话 ID 的 RFC2109 cookie 的名称和属性
Syntax:SessionDBDCookieName name attributes
Default:none
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_session_dbd

SessionDBDCookieName伪指令指定将在其中存储会话 ID 的 RFC2109 兼容 cookie 的名称和可选属性。使用Set-Cookie HTTP Headers 设置 RFC2109 cookie。

可以按照以下示例指定 cookie 属性的可选列表。这些属性将按原样插入 Cookie 中,并且 Apache 不会对其进行解释。确保根据 cookie 规范正确定义了属性。

Session On
SessionDBDCookieName session path=/private;domain=example.com;httponly;secure;version=1;

SessionDBDCookieName2 Directive

Description:存储会话 ID 的 RFC2965 cookie 的名称和属性
Syntax:SessionDBDCookieName2 name attributes
Default:none
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_session_dbd

SessionDBDCookieName2伪指令指定将在其中存储会话 ID 的 RFC2965 兼容 cookie 的名称和可选属性。 RFC2965 cookie 是使用Set-Cookie2 HTTP Headers 设置的。

可以按照以下示例指定 cookie 属性的可选列表。这些属性将按原样插入 Cookie 中,并且 Apache 不会对其进行解释。确保根据 cookie 规范正确定义了属性。

具有属性的 Cookie2

Session On
SessionDBDCookieName2 session path=/private;domain=example.com;httponly;secure;version=1;

SessionDBDCookieRemove Directive

Description:控制是否应从传入的 HTTP Headers 中删除会话 ID cookie
Syntax:SessionDBDCookieRemove On|Off
Default:SessionDBDCookieRemove On
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_session_dbd

SessionDBDCookieRemove标志控制是否在请求处理期间从标题中删除包含会话 ID 的 cookie。

在反向代理的情况下,Apache 服务器充当后端原始服务器的服务器前端,将会话 ID cookie 的内容透露给后端可能会潜在地侵犯隐私。设置为 on 时,会话 ID cookie 将从传入的 HTTP Headers 中删除。

SessionDBDDeleteLabel Directive

Description:用于从数据库中删除会话的 SQL 查询
Syntax:SessionDBDDeleteLabel label
Default:SessionDBDDeleteLabel deletesession
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_session_dbd

SessionDBDDeleteLabel伪指令设置默认的删除查询标签,该标签用于删除过期或空的会话。此标签必须事先使用DBDPrepareSQL指令定义。

SessionDBDInsertLabel Directive

Description:用于将会话插入数据库的 SQL 查询
Syntax:SessionDBDInsertLabel label
Default:SessionDBDInsertLabel insertsession
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_session_dbd

SessionDBDInsertLabel伪指令设置用于在会话中加载的默认插入查询标签。此标签必须事先使用DBDPrepareSQL指令定义。

如果尝试更新会话不影响任何行,则将调用此查询以将会话插入数据库。

SessionDBDPerUser Directive

Description:启用每个用户会话
Syntax:SessionDBDPerUser On|Off
Default:SessionDBDPerUser Off
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_session_dbd

SessionDBDPerUser标志启用针对每个用户会话的用户登录名。如果用户未登录,则该指令将被忽略。

SessionDBDSelectLabel Directive

Description:用于从数据库中选择会话的 SQL 查询
Syntax:SessionDBDSelectLabel label
Default:SessionDBDSelectLabel selectsession
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_session_dbd

SessionDBDSelectLabel伪指令设置用于在会话中加载的默认选择查询标签。此标签必须事先使用DBDPrepareSQL指令定义。

SessionDBDUpdateLabel Directive

Description:用于更新数据库中现有会话的 SQL 查询
Syntax:SessionDBDUpdateLabel label
Default:SessionDBDUpdateLabel updatesession
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_session_dbd

SessionDBDUpdateLabel伪指令设置用于在会话中加载的默认更新查询标签。此标签必须事先使用DBDPrepareSQL指令定义。

如果尝试更新会话不影响任何行,则将调用插入查询以将会话插入数据库。如果数据库支持 InsertOrUpdate,请覆盖此查询以在一个查询而不是两个查询中执行更新。