mod_session_dbd
描述: | DBD/SQL 基于 session 支持 |
状态: | 延期 |
模块标识符: | session_dbd_module |
源文件: | mod_session_dbd.c |
兼容性: | 可在 Apache 2.3 及更高版本中使用 |
摘要
警告
session 模块使用 HTTP cookies,因此可能成为 Cross Site Scripting 攻击的受害者,或者将潜在的私人信息暴露给 clients。在服务器上启用 session 功能之前,请确保已考虑相关风险。
此mod_session子模块使用mod_dbd模块支持在 SQL 数据库中存储用户会话。
会话可以是匿名,其中 session 由存储在 cookie 中的浏览器上的唯一 UUID string 键入,或每用户,其中 session 是针对登录用户的用户 ID 键入的。
基于 SQL 的会话对浏览器是隐藏的,因此无需加密即可提供隐私措施。
服务器场内的不同 Web 服务器可以选择共享数据库,从而彼此共享会话。
有关 session 接口的更多详细信息,请参阅mod_session模块的文档。
DBD Configuration
在可以将mod_session_dbd模块配置为维护 session 之前,必须配置mod_dbd模块以使服务器可以使用各种数据库查询。
要保持 session,选择现有的 session,更新现有的 session,插入新的 session,以及删除过期的或空的 session,需要四个查询。这些查询按照下面的 example 配置。
Sample DBD configuration
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 中的浏览器中。此方法类似于大多数 application 服务器用于 store session 信息的方法。
要创建一个简单的匿名 session 并将其存储在名为 apachesession 的 postgres 数据库 table 中,并将 session ID 保存在名为 session 的 cookie 中,请按如下方式配置 session:
基于 SQL 的匿名 session
Session On SessionDBDCookieName session path=/
有关如何将 session 配置为由 CGI application 读取和写入的更多示例,请参阅mod_session示例部分。
有关如何使用 session 来存储用户名和密码详细信息的文档,请参阅mod_auth_form模块。
每个用户会话
每个用户会话根据成功通过身份验证的用户的用户名进行键控。它提供最大的隐私,因为在认证领域之外没有 session 的外部句柄。
每个用户会话在正确配置的经过身份验证的环境中工作,使用基本身份验证,摘要式身份验证或 SSL client 证书。由于谁首先出现的限制,鸡肉或鸡蛋,每个用户会话不能用于从mod_auth_form等模块存储身份验证凭据。
要创建一个简单的每用户 session 并将其存储在名为 apachesession 的 postgres 数据库 table 中,并将 session 键入 userid,请按如下方式配置 session:
基于 SQL 的每个用户 session
Session On SessionDBDPerUser On
数据库管家
在 time 期间,可以预期数据库开始累积过期的会话。此时,mod_session_dbd模块还无法自动处理 session 到期。
警告
管理员需要通过 cron 设置外部 process 来清除过期的会话。
SessionDBDCookieName 指令
描述: | Name 和存储 session ID 的 RFC2109 cookie 的属性 |
句法: | SessionDBDCookieName name attributes |
默认: | none |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_session_dbd |
SessionDBDCookieName
指令指定符合 RFC2109 的 cookie 的 name 和可选属性,其中将存储 session ID。 RFC2109 cookies 使用Set-Cookie
HTTP 标头设置。
可以指定 cookie 属性的可选列表,如下面的 example 所示。这些属性按原样插入到 cookie 中,并且不由 Apache 解释。确保根据 cookie 规范正确定义属性。
Cookie 有属性
Session On SessionDBDCookieName session path=/private;domain=example.com;httponly;secure;version=1;
SessionDBDCookieName2 指令
描述: | Name 和存储 session ID 的 RFC2965 cookie 的属性 |
句法: | SessionDBDCookieName2 name attributes |
默认: | none |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_session_dbd |
SessionDBDCookieName2
指令指定符合 RFC2965 的 cookie 的 name 和可选属性,其中将存储 session ID。 RFC2965 cookies 使用Set-Cookie2
HTTP 标头设置。
可以指定 cookie 属性的可选列表,如下面的 example 所示。这些属性按原样插入到 cookie 中,并且不由 Apache 解释。确保根据 cookie 规范正确定义属性。
Cookie2 具有属性
Session On SessionDBDCookieName2 session path=/private;domain=example.com;httponly;secure;version=1;
SessionDBDCookieRemove 指令
描述: | 控制是否应从传入的 HTTP headers 中删除 session ID cookies |
句法: | SessionDBDCookieRemove On\|Off |
默认: | SessionDBDCookieRemove On |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_session_dbd |
SessionDBDCookieRemove
flag 控制在请求处理期间是否将从 headers 中删除包含 session ID 的 cookies。
在反向代理情况下,Apache 服务器充当后端源服务器的服务器前端,向后端显示 session ID cookie 的内容可能是潜在的隐私侵犯。设置为 on 时,session ID cookie 将从传入的 HTTP headers 中删除。
SessionDBDDeleteLabel 指令
描述: | 用于从数据库中删除会话的 SQL 查询 |
句法: | SessionDBDDeleteLabel label |
默认: | SessionDBDDeleteLabel deletesession |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_session_dbd |
SessionDBDDeleteLabel
指令设置用于删除过期或空 session 的默认删除查询标签。此标签必须先使用DBDPrepareSQL指令定义。
SessionDBDInsertLabel 指令
描述: | 用于将会话插入数据库的 SQL 查询 |
句法: | SessionDBDInsertLabel label |
默认: | SessionDBDInsertLabel insertsession |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_session_dbd |
SessionDBDInsertLabel
指令设置用于加载 session 的默认 insert 查询标签。此标签必须先使用DBDPrepareSQL指令定义。
如果尝试更新 session 不会影响任何行,则将调用此查询以将 session 插入数据库。
SessionDBDPerUser 指令
描述: | 启用每个用户 session |
句法: | SessionDBDPerUser On\|Off |
默认: | SessionDBDPerUser Off |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_session_dbd |
SessionDBDPerUser
flag 允许每个用户使用 session 键入用户的登录名 name。如果用户未登录,则将忽略此指令。
SessionDBDSelectLabel 指令
描述: | 用于从数据库中选择会话的 SQL 查询 |
句法: | SessionDBDSelectLabel label |
默认: | SessionDBDSelectLabel selectsession |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_session_dbd |
SessionDBDSelectLabel
指令设置用于加载 session 的默认 select 查询标签。此标签必须先使用DBDPrepareSQL指令定义。
SessionDBDUpdateLabel 指令
描述: | 用于更新数据库中现有会话的 SQL 查询 |
句法: | SessionDBDUpdateLabel label |
默认: | SessionDBDUpdateLabel updatesession |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_session_dbd |
SessionDBDUpdateLabel
指令设置用于加载 session 的默认更新查询标签。此标签必须先使用DBDPrepareSQL指令定义。
如果尝试更新 session 不会影响任何行,则会调用 insert 查询以将 session 插入数据库。如果数据库支持 InsertOrUpdate,则覆盖此查询以在一个查询中执行更新而不是两个。