Apache 模块 mod_session

Description:Session support
Status:Extension
Module Identifier:session_module
Source File:mod_session.c
Compatibility:在 Apache 2.3 和更高版本中可用

Summary

Warning

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

此模块为每个用户会话界面的服务器范围提供支持。会话可用于跟踪用户是否已登录,或用于其他每个用户的信息,这些信息应在请求中保持可用。

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

可以从依赖于该会话的其他模块中操纵会话,或者可以根据情况使用环境变量和 HTTP Headers 从中读取会话或将会话写入会话。

什么是会话?

会话界面的核心是键和值对的表,这些表可跨浏览器请求访问。根据应用程序使用会话的需要,可以将这些对设置为任何有效的字符串。

“会话”是 application/x-www-form-urlencoded 字符串,其中包含HTML specification定义的这些键值对。

在将会话写入 Management 员定义的存储机制之前,可以选择对会话进行加密和 base64 编码。

谁可以使用会话?

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

在服务器上保留会话

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

如果配置了会话,则使用存储在 cookie 中的会话 ID 进行跟踪,或者从典型的 GET 请求中发现的 URL 查询字符串中嵌入的参数中提取会话 ID。

由于会话的内容专门存储在服务器上,因此期望会话内容的私密性。如果存在大量会话,或者大量 Web 服务器必须彼此共享会话,这确实会对性能和资源产生影响。

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

在浏览器上保留会话

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

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

但是,会话的内容会暴露给 Client 端,从而带来失去隐私的风险。可以将mod_session_crypto模块配置为在将会话写入 Client 端之前加密会话的内容。

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

Basic Examples

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

基于浏览器的会话

Session On
SessionCookieName session path=/

除非可以写入或读取会话,否则该会话无用。以下示例显示如何通过使用称为X-Replace-Session的 sched HTTP 响应 Headers 将值注入会话中。

撰写会议

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

Headers 应包含名称值对,其格式与 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

Session Privacy

使用浏览器的“显示 cookie”功能,您将看到会话的清晰文本表示。如果最终用户需要保持对会话内容的意识,或者在第三方可以未经授权访问会话中的数据的地方,那么这可能是一个问题。

在使用mod_session_crypto模块将会话内容放置在浏览器上之前,可以选择对其进行加密。

基于浏览器的加密会话

Session On
SessionCryptoPassphrase secret
SessionCookieName session path=/

该会话将在加载时自动解密,并在保存时由 Apache 加密,使用该会话的基础应用程序不需要知道正在进行加密。

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

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

Warning

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

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

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

如果 Apache 服务器构成后端原始服务器的前端,则可以使用SessionCookieRemove指令从传入的 HTTP Headers 中删除会话 cookie。这样可以防止会话 Cookie 的内容从后端服务器访问。

会话支持身份验证

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

基于表单的身份验证

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

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

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

为了使会话有用,必须可以与外部应用程序共享会话的内容,并且外部应用程序必须可以编写自己的会话。

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

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

  • Apache modules

    • 服务器中需要访问会话的模块可以使用 mod_session.h API 来读取和写入会话。 mod_auth_form之类的模块使用此机制。
  • CGI 程序和脚本语言

    • 在 Web 服务器中运行的应用程序可以选择从 HTTP_SESSION 环境变量中检索会话的值。如HTML specification所述,会话应编码为 application/x-www-form-urlencoded 字符串。环境变量由SessionEnv指令的设置控制。可以通过返回 application/x-www-form-urlencoded 响应 Headers(其名称由SessionHeader指令设置)来由脚本写入会话。在这两种情况下,任何加密或解密,以及从所选存储机制中读取会话或将会话写入所选存储机制均由mod_session模块和相应的配置来处理。
  • mod_proxy后面的应用

    • 如果使用SessionHeader指令定义 HTTP 请求 Headers,则该会话将以 application/x-www-form-urlencoded 字符串编码,将对应用程序可用。如果响应中提供了相同的 Headers,则此响应 Headers 的值将用于替换会话。如上所述,任何加密或解密以及从所选存储机制读取会话或将会话写入所选存储机制均由mod_session模块和相应的配置来处理。
  • Standalone applications

    • 应用程序可能选择在 Apache HTTP 服务器无法控制的范围内操纵会话。在这种情况下,应用程序有责任从所选的存储机制中读取会话,解密会话,更新会话,加密会话并将会话适当地写入所选的存储机制。

Session Directive

Description:为当前目录或位置启用会话
Syntax:Session On|Off
Default:Session Off
Context:服务器配置,虚拟主机,目录,.htaccess
Override:AuthConfig
Status:Extension
Module:mod_session

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

SessionEnv Directive

Description:控制是否将会话的内容写入 HTTP_SESSION 环境变量
Syntax:SessionEnv On|Off
Default:SessionEnv Off
Context:服务器配置,虚拟主机,目录,.htaccess
Override:AuthConfig
Status:Extension
Module:mod_session

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

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

key1=foo&key3=bar

SessionExclude Directive

Description:定义将忽略会话的 URL 前缀
Syntax:SessionExclude path
Default:none
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_session

SessionExclude指令仅允许相对于 URL 前缀禁用会话。通过定位应为其维护会话的更精确的 URL 空间,这可以用于使网站更高效。默认情况下,目录或位置中的所有 URL 都包含在会话中。 SessionExclude指令优先于SessionInclude指令。

Warning

此伪指令与 HTTP cookie 中的 path 属性具有相似的用途,但请勿与此属性混淆。该伪指令未设置路径属性,该路径属性必须单独配置。

SessionExpiryUpdateInterval Directive

Description:定义会话的过期时间可能会更改的秒数,而无需更新会话
Syntax:SessionExpiryUpdateInterval interval
Default:SessionExpiryUpdateInterval 0 (always update)
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_session
Compatibility:在 Apache 2.4.41 及更高版本中可用

SessionExpiryUpdateInterval指令允许会话避免仅在到期时间已更改的情况下与写入每个请求的会话相关的开销。使用mod_session_dbd时,可以使用它来提高网站的效率或减少数据库的负载。如果会话中存储的数据已更改或过期更改的时间超过配置的间隔,则始终会写入会话。

将时间间隔设置为零将禁用此伪指令,并且会话到期将针对每个请求进行刷新。

仅当与SessionMaxAge结合使用以启用会话到期时,此指令才有效。只有在会话中存储的数据发生更改时,才会写入没有到期的会话。

Warning

由于会话到期可能不会随每个请求刷新,因此会话有可能提前到秒间隔。使用较小的时间间隔通常可以提供足够的节省,同时对到期分辨率的影响最小。

SessionHeader Directive

Description:从给定的 HTTP 响应 Headers 导入会话更新
Syntax:SessionHeader header
Default:none
Context:服务器配置,虚拟主机,目录,.htaccess
Override:AuthConfig
Status:Extension
Module:mod_session

SessionHeader指令定义 HTTP 响应 Headers 的名称(如果存在),将对其进行解析并将其写入当前会话。

Headers 值应采用 URL 查询格式,例如:

key1=foo&key2=&key3=bar

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

SessionInclude Directive

Description:定义会话有效的 URL 前缀
Syntax:SessionInclude path
Default:all URLs
Context:服务器配置,虚拟主机,目录,.htaccess
Override:AuthConfig
Status:Extension
Module:mod_session

SessionInclude指令仅使会话对特定的 URL 前缀有效。通过定位应为其维护会话的更精确的 URL 空间,这可以用于使网站更高效。默认情况下,目录或位置中的所有 URL 都包含在会话中。

Warning

此伪指令与 HTTP cookie 中的 path 属性具有相似的用途,但请勿与此属性混淆。该伪指令未设置路径属性,该路径属性必须单独配置。

SessionMaxAge Directive

Description:定义会话的最大年龄(以秒为单位)
Syntax:SessionMaxAge maxage
Default:SessionMaxAge 0
Context:服务器配置,虚拟主机,目录,.htaccess
Override:AuthConfig
Status:Extension
Module:mod_session

SessionMaxAge指令定义了会话将保持有效的时间限制。保存会话后,此时间限制将重置,现有会话可以 continue。如果会话超过此限制的时间而没有请求服务器刷新会话,则该会话将超时并被删除。如果使用会话来存储用户登录详细信息,则具有在给定时间后自动注销用户的作用。

将最大值设置为零将禁用会话到期。