Apache HTTP Server 版本 2.4
描述 | 基于 DBD/SQL 的会话支持 |
---|---|
状态 | 扩展 |
模块标识符 | session_dbd_module |
源文件 | mod_session_dbd.c |
兼容性 | 在 Apache 2.3 及更高版本中可用 |
会话模块使用 HTTP cookie,因此可能成为跨站点脚本攻击的受害者,或将潜在的私密信息暴露给客户端。在您的服务器上启用会话功能之前,请确保已考虑相关风险。
此 mod_session
的子模块提供对使用 mod_dbd
模块在 SQL 数据库中存储用户会话的支持。
会话可以是**匿名**的,其中会话由存储在浏览器 cookie 中的唯一 UUID 字符串作为键,也可以是**按用户**的,其中会话由已登录用户的用户 ID 作为键。
基于 SQL 的会话对浏览器隐藏,因此在不需要加密的情况下提供了一定程度的隐私。
服务器场中的不同 Web 服务器可以选择共享一个数据库,从而相互共享会话。
有关会话接口的更多详细信息,请参阅 mod_session
模块的文档。
在配置 mod_session_dbd
模块以维护会话之前,必须配置 mod_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 cookie 中。此方法类似于大多数应用程序服务器用于存储会话信息的方法。
要创建一个简单的匿名会话并将其存储在名为 apachesession 的 postgres 数据库表中,并将会话 ID 保存到名为 session 的 cookie 中,请按如下方式配置会话
Session On SessionDBDCookieName session path=/
有关如何配置会话以供 CGI 应用程序读取和写入的更多示例,请参阅 mod_session
示例部分。
有关如何使用会话存储用户名和密码详细信息的文档,请参阅 mod_auth_form
模块。
按用户会话使用成功验证用户的用户名作为键。它提供了最大的隐私,因为除了已验证的领域之外,没有其他外部句柄可以访问会话。
按用户会话在正确配置的已验证环境中工作,无论是使用基本身份验证、摘要身份验证还是 SSL 客户端证书。由于先有鸡还是先有蛋的限制,按用户会话不能用于存储来自 mod_auth_form
等模块的身份验证凭据。
要创建一个简单的按用户会话并将其存储在名为 apachesession 的 postgres 数据库表中,并将会话键设置为用户 ID,请按如下方式配置会话
Session On SessionDBDPerUser On
描述 | 存储会话 ID 的 RFC2109 cookie 的名称和属性 |
---|---|
语法 | SessionDBDCookieName name attributes |
默认值 | 无 |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
状态 | 扩展 |
模块 | mod_session_dbd |
SessionDBDCookieName
指令指定存储会话 ID 的符合 RFC2109 的 cookie 的名称和可选属性。RFC2109 cookie 使用 Set-Cookie
HTTP 标头设置。
可以指定可选的 cookie 属性列表,如下例所示。这些属性按原样插入 cookie 中,不会被 Apache 解释。确保您的属性根据 cookie 规范正确定义。
Session On SessionDBDCookieName session path=/private;domain=example.com;httponly;secure;version=1;
描述 | 存储会话 ID 的 RFC2965 cookie 的名称和属性 |
---|---|
语法 | SessionDBDCookieName2 name attributes |
默认值 | 无 |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
状态 | 扩展 |
模块 | mod_session_dbd |
SessionDBDCookieName2
指令指定存储会话 ID 的符合 RFC2965 的 cookie 的名称和可选属性。RFC2965 cookie 使用 Set-Cookie2
HTTP 标头设置。
可以指定可选的 cookie 属性列表,如下例所示。这些属性按原样插入 cookie 中,不会被 Apache 解释。确保您的属性根据 cookie 规范正确定义。
Session On SessionDBDCookieName2 session path=/private;domain=example.com;httponly;secure;version=1;
描述 | 控制是否应从传入的 HTTP 标头中删除会话 ID cookie |
---|---|
语法 | SessionDBDCookieRemove On|Off |
默认值 | SessionDBDCookieRemove On |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
状态 | 扩展 |
模块 | mod_session_dbd |
SessionDBDCookieRemove
标志控制在请求处理期间是否从标头中删除包含会话 ID 的 cookie。
在 Apache 服务器充当后端源服务器的服务器前端的反向代理情况下,将会话 ID cookie 的内容泄露给后端可能会造成潜在的隐私泄露。当设置为 on 时,会话 ID cookie 将从传入的 HTTP 标头中删除。
描述 | 用于从数据库中删除会话的 SQL 查询 |
---|---|
语法 | SessionDBDDeleteLabel label |
默认值 | SessionDBDDeleteLabel deletesession |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
状态 | 扩展 |
模块 | mod_session_dbd |
SessionDBDDeleteLabel
指令设置用于删除已过期或空的会话的默认删除查询标签。此标签必须使用 DBDPrepareSQL
指令预先定义。
描述 | 用于将会话插入数据库的 SQL 查询 |
---|---|
语法 | SessionDBDInsertLabel label |
默认值 | SessionDBDInsertLabel insertsession |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
状态 | 扩展 |
模块 | mod_session_dbd |
SessionDBDInsertLabel
指令设置用于加载会话的默认插入查询标签。此标签必须使用 DBDPrepareSQL
指令预先定义。
如果尝试更新会话影响的行数为零,则将调用此查询将会话插入数据库。
描述 | 启用按用户会话 |
---|---|
语法 | SessionDBDPerUser On|Off |
默认值 | SessionDBDPerUser Off |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
状态 | 扩展 |
模块 | mod_session_dbd |
SessionDBDPerUser
标志启用使用用户的登录名作为键的按用户会话。如果用户未登录,则将忽略此指令。
描述 | 用于从数据库中选择会话的 SQL 查询 |
---|---|
语法 | SessionDBDSelectLabel label |
默认值 | SessionDBDSelectLabel selectsession |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
状态 | 扩展 |
模块 | mod_session_dbd |
SessionDBDSelectLabel
指令设置用于加载会话的默认选择查询标签。此标签必须使用 DBDPrepareSQL
指令预先定义。
描述 | 用于更新数据库中现有会话的 SQL 查询 |
---|---|
语法 | SessionDBDUpdateLabel label |
默认值 | SessionDBDUpdateLabel updatesession |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
状态 | 扩展 |
模块 | mod_session_dbd |
SessionDBDUpdateLabel
指令设置用于加载会话的默认更新查询标签。此标签必须使用 DBDPrepareSQL
指令预先定义。
如果尝试更新会话影响的行数为零,则将调用插入查询将会话插入数据库。如果数据库支持 InsertOrUpdate,请覆盖此查询以在一个查询中执行更新,而不是两个查询。