<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 模块 mod_session

可用语言:  en  |  fr 

描述会话支持
状态扩展
模块标识符session_module
源文件mod_session.c
兼容性在 Apache 2.3 及更高版本中可用

摘要

警告

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

此模块提供对服务器范围内的每个用户会话接口的支持。会话可用于跟踪用户是否已登录,或用于应在请求之间保持可用的其他每个用户信息。

会话可以存储在服务器上,也可以存储在浏览器上。会话还可以选择性地加密以增强安全性。这些功能除了 mod_session 之外,还分为几个模块;mod_session_cryptomod_session_cookiemod_session_dbd。根据服务器要求,将适当的模块加载到服务器中(静态地在编译时加载,或动态地通过 LoadModule 指令加载)。

会话可以从依赖于会话的其他模块进行操作,或者可以使用环境变量和 HTTP 标头(根据需要)从会话中读取和写入会话。

Support Apache!

主题

指令

错误修复清单

另请参阅

top

什么是会话?

会话接口的核心是一个键值对表,这些键值对在浏览器请求之间可访问。这些对可以设置为任何有效的字符串,具体取决于使用会话的应用程序。

“会话”是一个包含这些键值对的 application/x-www-form-urlencoded 字符串,如 HTML 规范 中所定义。

会话可以选择性地在写入存储机制之前进行加密和 Base64 编码,如管理员所定义。

top

谁可以使用会话?

会话接口主要用于其他服务器模块(例如 mod_auth_form),但是基于 CGI 的应用程序可以选择性地通过 HTTP_SESSION 环境变量获得对会话内容的访问权限。会话可以选择通过插入包含新会话参数的 HTTP 响应标头来修改和/或更新。

top

将会话保留在服务器上

Apache 可以配置为跟踪存储在特定服务器或服务器组上的每个用户会话。此功能类似于典型应用程序服务器中可用的会话。

如果已配置,则通过使用存储在 cookie 中的会话 ID 或从 URL 查询字符串中嵌入的参数(如典型的 GET 请求中所找到)中提取的会话 ID 来跟踪会话。

由于会话的内容仅存储在服务器上,因此期望会话内容的隐私。如果存在大量会话,或者大量 Web 服务器必须相互共享会话,则会对性能和资源产生影响。

mod_session_dbd 模块允许通过 mod_dbd 在 SQL 数据库中存储用户会话。

top

将会话保留在浏览器上

在高流量环境中,在服务器上跟踪会话过于占用资源或不方便,可以选择将会话内容存储在客户端浏览器上的 cookie 中。

这样做的优点是服务器上需要最少的资源来跟踪会话,并且服务器场中的多个服务器无需共享会话信息。

但是,会话的内容会暴露给客户端,相应的风险是隐私丢失。可以使用 mod_session_crypto 模块配置将会话内容加密,然后再将会话写入客户端。

mod_session_cookie 允许在 HTTP cookie 中将用户会话存储在浏览器上。

top

基本示例

创建会话就像打开会话并决定会话将存储在何处一样简单。在此示例中,会话将存储在浏览器上的名为 session 的 cookie 中。

基于浏览器的会话

Session On
SessionCookieName session path=/

除非可以写入或读取会话,否则会话将无用。以下示例显示如何通过使用预定的 HTTP 响应标头(称为 X-Replace-Session)将值注入会话。

写入会话

Session On
SessionCookieName session path=/
SessionHeader X-Replace-Session

标头应包含以与 URL 中查询字符串相同的格式表示的名称值对,如以下示例所示。将键设置为空字符串的效果是从会话中删除该键。

CGI 写入会话

#!/bin/bash
echo "Content-Type: text/plain"
echo "X-Replace-Session: key1=foo&key2=&key3=bar"
echo
env

如果已配置,则可以从 HTTP_SESSION 环境变量中读取回会话。默认情况下,会话保持私密,因此必须使用 SessionEnv 指令显式打开它。

从会话中读取

Session On
SessionEnv On
SessionCookieName session path=/
SessionHeader X-Replace-Session

读取后,CGI 变量 HTTP_SESSION 应包含值 key1=foo&key3=bar

top

会话隐私

使用浏览器的“显示 cookie”功能,您会看到会话的明文表示。如果最终用户需要对会话内容保密,或者第三方可能未经授权访问会话中的数据,这可能是一个问题。

可以使用 mod_session_crypto 模块选择性地加密会话内容,然后再将其放置在浏览器上。

基于浏览器的加密会话

Session On
SessionCryptoPassphrase secret
SessionCookieName session path=/

会话将在加载时自动解密,并在保存时由 Apache 加密,使用会话的底层应用程序无需知道正在进行加密。

存储在服务器上而不是浏览器上的会话也可以根据需要进行加密,从而在使用 mod_session_dbd 模块的服务器场中 Web 服务器之间共享潜在敏感信息时提供隐私。

top

Cookie 隐私

HTTP cookie 机制还提供隐私功能,例如仅将 cookie 传输限制为受 SSL 保护的页面,或阻止基于浏览器的 JavaScript 访问 cookie 内容。

警告

一些 HTTP cookie 隐私功能不是标准的,或者在不同浏览器之间没有一致地实现。会话模块允许您设置 cookie 参数,但不能保证浏览器会尊重隐私。如果安全性是一个问题,请使用 mod_session_crypto 加密会话内容,或使用 mod_session_dbd 模块将会话存储在服务器上。

标准 cookie 参数可以在 cookie 名称之后指定,如以下示例所示。

设置 cookie 参数

Session On
SessionCryptoPassphrase secret
SessionCookieName session path=/private;domain=example.com;httponly;secure;

在 Apache 服务器充当后端源服务器的前端的情况下,可以使用 SessionCookieRemove 指令从传入的 HTTP 标头中删除会话 cookie。这可以防止会话 cookie 的内容从后端服务器访问。

top

会话对身份验证的支持

与许多应用程序服务器中可能的情况一样,身份验证模块可以使用会话在登录后存储用户名和密码。 mod_auth_form 在会话中保存用户的登录名和密码。

基于表单的身份验证

Session On
SessionCryptoPassphrase secret
SessionCookieName session path=/
AuthFormProvider file
AuthUserFile "conf/passwd"
AuthType form
AuthName "realm"
#...

有关文档和完整示例,请参阅 mod_auth_form 模块。

top

将会话与外部应用程序集成

为了使会话有用,必须能够与外部应用程序共享会话内容,并且必须能够让外部应用程序写入自己的会话。

一个典型的示例可能是更改由 mod_auth_form 设置的用户密码的应用程序。此应用程序需要从会话中读取当前用户名和密码,对用户密码进行必要的更改,然后将新密码写入会话,以便无缝过渡到新密码。

第二个示例可能涉及首次注册新用户的应用程序。注册完成后,用户名和密码将写入会话,从而无缝过渡到登录状态。

Apache 模块
服务器中需要访问会话的模块可以使用 mod_session.h API 来读取和写入会话。此机制由 mod_auth_form 等模块使用。
CGI 程序和脚本语言
在 Web 服务器中运行的应用程序可以选择性地从 HTTP_SESSION 环境变量中检索会话的值。会话应编码为 application/x-www-form-urlencoded 字符串,如 HTML 规范 中所述。环境变量由 SessionEnv 指令的设置控制。脚本可以通过返回具有由 SessionHeader 指令设置的名称的 application/x-www-form-urlencoded 响应标头来写入会话。在这两种情况下,任何加密或解密以及从选定存储机制中读取会话或将会话写入选定存储机制都由 mod_session 模块和相应的配置处理。
位于 mod_proxy 后面的应用程序
如果使用 SessionHeader 指令来定义 HTTP 请求头,则会话(以 **application/x-www-form-urlencoded** 字符串编码)将提供给应用程序。如果在响应中提供了相同的头,则此响应头的值将用于替换会话。如上所述,任何加密或解密以及从选定存储机制读取会话或将会话写入选定存储机制的操作都由 mod_session 模块和相应的配置处理。
独立应用程序
应用程序可以选择在 Apache HTTP 服务器控制之外操作会话。在这种情况下,应用程序有责任从选定的存储机制读取会话,解密会话,更新会话,加密会话并将会话写入选定的存储机制(如果适用)。
top

Session 指令

描述为当前目录或位置启用会话
语法Session On|Off
默认值Session Off
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖AuthConfig
状态扩展
模块mod_session

Session 指令为目录或位置容器启用会话。其他指令控制会话的存储位置以及如何维护隐私。

top

SessionEnv 指令

描述控制是否将会话内容写入 HTTP_SESSION 环境变量
语法SessionEnv On|Off
默认值SessionEnv Off
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖AuthConfig
状态扩展
模块mod_session

如果设置为 On,则 SessionEnv 指令会导致将会话内容写入名为 HTTP_SESSION 的 CGI 环境变量。

该字符串以 URL 查询格式写入,例如

key1=foo&key3=bar

top

SessionExclude 指令

描述定义忽略会话的 URL 前缀
语法SessionExclude path
默认值
上下文服务器配置、虚拟主机、目录、.htaccess
状态扩展
模块mod_session

SessionExclude 指令允许仅相对于 URL 前缀禁用会话。这可用于提高网站效率,方法是针对应维护会话的更精确的 URL 空间。默认情况下,目录或位置内的所有 URL 都包含在会话中。 SessionExclude 指令优先于 SessionInclude 指令。

警告

此指令与 HTTP cookie 中的 path 属性具有类似的目的,但不要与该属性混淆。此指令不会设置 path 属性,该属性必须单独配置。

top

SessionExpiryUpdateInterval 指令

描述定义会话过期时间可以更改而无需更新会话的秒数
语法SessionExpiryUpdateInterval interval
默认值SessionExpiryUpdateInterval 0(始终更新)
上下文服务器配置、虚拟主机、目录、.htaccess
状态扩展
模块mod_session
兼容性在 Apache 2.4.41 及更高版本中可用

SessionExpiryUpdateInterval 指令允许会话避免与每次请求写入会话相关的成本,而仅过期时间已更改。这可用于提高网站效率或减少使用 mod_session_dbd 时数据库的负载。如果存储在会话中的数据已更改或过期时间已更改超过配置的间隔,则始终写入会话。

将间隔设置为零将禁用此指令,并且会话过期时间将为每次请求刷新。

此指令仅在与 SessionMaxAge 结合使用以启用会话过期时才有效。没有过期时间的会话仅在存储在会话中的数据已更改时写入。

警告

由于会话过期时间可能不会为每次请求刷新,因此会话可能会提前最多 interval 秒过期。使用较小的间隔通常可以提供足够的节省,同时对过期时间解析的影响最小。

top

SessionHeader 指令

描述从给定的 HTTP 响应头导入会话更新
语法SessionHeader header
默认值
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖AuthConfig
状态扩展
模块mod_session

SessionHeader 指令定义 HTTP 响应头的名称,如果存在,该响应头将被解析并写入当前会话。

预期头值为 URL 查询格式,例如

key1=foo&key2=&key3=bar

如果将键设置为空字符串,则该键将从会话中删除。

top

SessionInclude 指令

描述定义会话有效的 URL 前缀
语法SessionInclude path
默认值所有 URL
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖AuthConfig
状态扩展
模块mod_session

SessionInclude 指令允许仅针对特定 URL 前缀使会话有效。这可用于提高网站效率,方法是针对应维护会话的更精确的 URL 空间。默认情况下,目录或位置内的所有 URL 都包含在会话中。

警告

此指令与 HTTP cookie 中的 path 属性具有类似的目的,但不要与该属性混淆。此指令不会设置 path 属性,该属性必须单独配置。

top

SessionMaxAge 指令

描述定义会话的最大生存时间(以秒为单位)
语法SessionMaxAge maxage
默认值SessionMaxAge 0
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖AuthConfig
状态扩展
模块mod_session

SessionMaxAge 指令定义会话保持有效的时限。保存会话时,此时限将重置,并且可以继续现有会话。如果会话在没有请求服务器刷新会话的情况下变得比此限制更旧,则会话将超时并被删除。如果使用会话来存储用户登录详细信息,则这将导致在给定时间后自动注销用户。

将 maxage 设置为零将禁用会话过期。

可用语言:  en  |  fr 

top

评论

注意
这不是问答部分。此处放置的评论应指向有关改进文档或服务器的建议,如果这些建议已实施或被认为无效/与主题无关,则我们的版主可能会将其删除。有关如何管理 Apache HTTP 服务器的问题应发送到我们的 IRC 频道 #httpd(在 Libera.chat 上)或发送到我们的 邮件列表