Apache HTTP 服务器版本 2.4
描述 | 会话支持 |
---|---|
状态 | 扩展 |
模块标识符 | session_module |
源文件 | mod_session.c |
兼容性 | 在 Apache 2.3 及更高版本中可用 |
会话模块使用 HTTP cookie,因此可能成为跨站点脚本攻击的受害者,或将潜在的私密信息暴露给客户端。在服务器上启用会话功能之前,请确保已考虑相关风险。
此模块提供对服务器范围内的每个用户会话接口的支持。会话可用于跟踪用户是否已登录,或用于应在请求之间保持可用的其他每个用户信息。
会话可以存储在服务器上,也可以存储在浏览器上。会话还可以选择性地加密以增强安全性。这些功能除了 mod_session
之外,还分为几个模块;mod_session_crypto
、mod_session_cookie
和 mod_session_dbd
。根据服务器要求,将适当的模块加载到服务器中(静态地在编译时加载,或动态地通过 LoadModule
指令加载)。
会话可以从依赖于会话的其他模块进行操作,或者可以使用环境变量和 HTTP 标头(根据需要)从会话中读取和写入会话。
会话接口的核心是一个键值对表,这些键值对在浏览器请求之间可访问。这些对可以设置为任何有效的字符串,具体取决于使用会话的应用程序。
“会话”是一个包含这些键值对的 application/x-www-form-urlencoded 字符串,如 HTML 规范 中所定义。
会话可以选择性地在写入存储机制之前进行加密和 Base64 编码,如管理员所定义。
会话接口主要用于其他服务器模块(例如 mod_auth_form
),但是基于 CGI 的应用程序可以选择性地通过 HTTP_SESSION 环境变量获得对会话内容的访问权限。会话可以选择通过插入包含新会话参数的 HTTP 响应标头来修改和/或更新。
Apache 可以配置为跟踪存储在特定服务器或服务器组上的每个用户会话。此功能类似于典型应用程序服务器中可用的会话。
如果已配置,则通过使用存储在 cookie 中的会话 ID 或从 URL 查询字符串中嵌入的参数(如典型的 GET 请求中所找到)中提取的会话 ID 来跟踪会话。
由于会话的内容仅存储在服务器上,因此期望会话内容的隐私。如果存在大量会话,或者大量 Web 服务器必须相互共享会话,则会对性能和资源产生影响。
mod_session_dbd
模块允许通过 mod_dbd
在 SQL 数据库中存储用户会话。
在高流量环境中,在服务器上跟踪会话过于占用资源或不方便,可以选择将会话内容存储在客户端浏览器上的 cookie 中。
这样做的优点是服务器上需要最少的资源来跟踪会话,并且服务器场中的多个服务器无需共享会话信息。
但是,会话的内容会暴露给客户端,相应的风险是隐私丢失。可以使用 mod_session_crypto
模块配置将会话内容加密,然后再将会话写入客户端。
mod_session_cookie
允许在 HTTP cookie 中将用户会话存储在浏览器上。
创建会话就像打开会话并决定会话将存储在何处一样简单。在此示例中,会话将存储在浏览器上的名为 session
的 cookie 中。
Session On SessionCookieName session path=/
除非可以写入或读取会话,否则会话将无用。以下示例显示如何通过使用预定的 HTTP 响应标头(称为 X-Replace-Session
)将值注入会话。
Session On SessionCookieName session path=/ SessionHeader X-Replace-Session
标头应包含以与 URL 中查询字符串相同的格式表示的名称值对,如以下示例所示。将键设置为空字符串的效果是从会话中删除该键。
#!/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
。
使用浏览器的“显示 cookie”功能,您会看到会话的明文表示。如果最终用户需要对会话内容保密,或者第三方可能未经授权访问会话中的数据,这可能是一个问题。
可以使用 mod_session_crypto
模块选择性地加密会话内容,然后再将其放置在浏览器上。
Session On SessionCryptoPassphrase secret SessionCookieName session path=/
会话将在加载时自动解密,并在保存时由 Apache 加密,使用会话的底层应用程序无需知道正在进行加密。
存储在服务器上而不是浏览器上的会话也可以根据需要进行加密,从而在使用 mod_session_dbd
模块的服务器场中 Web 服务器之间共享潜在敏感信息时提供隐私。
HTTP cookie 机制还提供隐私功能,例如仅将 cookie 传输限制为受 SSL 保护的页面,或阻止基于浏览器的 JavaScript 访问 cookie 内容。
一些 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 标头中删除会话 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
设置的用户密码的应用程序。此应用程序需要从会话中读取当前用户名和密码,对用户密码进行必要的更改,然后将新密码写入会话,以便无缝过渡到新密码。
第二个示例可能涉及首次注册新用户的应用程序。注册完成后,用户名和密码将写入会话,从而无缝过渡到登录状态。
mod_auth_form
等模块使用。SessionEnv
指令的设置控制。脚本可以通过返回具有由 SessionHeader
指令设置的名称的 application/x-www-form-urlencoded 响应标头来写入会话。在这两种情况下,任何加密或解密以及从选定存储机制中读取会话或将会话写入选定存储机制都由 mod_session
模块和相应的配置处理。mod_proxy
后面的应用程序SessionHeader
指令来定义 HTTP 请求头,则会话(以 **application/x-www-form-urlencoded** 字符串编码)将提供给应用程序。如果在响应中提供了相同的头,则此响应头的值将用于替换会话。如上所述,任何加密或解密以及从选定存储机制读取会话或将会话写入选定存储机制的操作都由 mod_session
模块和相应的配置处理。描述 | 为当前目录或位置启用会话 |
---|---|
语法 | Session On|Off |
默认值 | Session Off |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | AuthConfig |
状态 | 扩展 |
模块 | mod_session |
Session
指令为目录或位置容器启用会话。其他指令控制会话的存储位置以及如何维护隐私。
描述 | 控制是否将会话内容写入 HTTP_SESSION 环境变量 |
---|---|
语法 | SessionEnv On|Off |
默认值 | SessionEnv Off |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | AuthConfig |
状态 | 扩展 |
模块 | mod_session |
如果设置为 On,则 SessionEnv
指令会导致将会话内容写入名为 HTTP_SESSION 的 CGI 环境变量。
该字符串以 URL 查询格式写入,例如
key1=foo&key3=bar
描述 | 定义忽略会话的 URL 前缀 |
---|---|
语法 | SessionExclude path |
默认值 | 无 |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
状态 | 扩展 |
模块 | mod_session |
SessionExclude
指令允许仅相对于 URL 前缀禁用会话。这可用于提高网站效率,方法是针对应维护会话的更精确的 URL 空间。默认情况下,目录或位置内的所有 URL 都包含在会话中。 SessionExclude
指令优先于 SessionInclude
指令。
此指令与 HTTP cookie 中的 path 属性具有类似的目的,但不要与该属性混淆。此指令不会设置 path 属性,该属性必须单独配置。
描述 | 定义会话过期时间可以更改而无需更新会话的秒数 |
---|---|
语法 | SessionExpiryUpdateInterval interval |
默认值 | SessionExpiryUpdateInterval 0(始终更新) |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
状态 | 扩展 |
模块 | mod_session |
兼容性 | 在 Apache 2.4.41 及更高版本中可用 |
SessionExpiryUpdateInterval
指令允许会话避免与每次请求写入会话相关的成本,而仅过期时间已更改。这可用于提高网站效率或减少使用 mod_session_dbd
时数据库的负载。如果存储在会话中的数据已更改或过期时间已更改超过配置的间隔,则始终写入会话。
将间隔设置为零将禁用此指令,并且会话过期时间将为每次请求刷新。
此指令仅在与 SessionMaxAge
结合使用以启用会话过期时才有效。没有过期时间的会话仅在存储在会话中的数据已更改时写入。
由于会话过期时间可能不会为每次请求刷新,因此会话可能会提前最多 interval 秒过期。使用较小的间隔通常可以提供足够的节省,同时对过期时间解析的影响最小。
描述 | 从给定的 HTTP 响应头导入会话更新 |
---|---|
语法 | SessionHeader header |
默认值 | 无 |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | AuthConfig |
状态 | 扩展 |
模块 | mod_session |
SessionHeader
指令定义 HTTP 响应头的名称,如果存在,该响应头将被解析并写入当前会话。
预期头值为 URL 查询格式,例如
key1=foo&key2=&key3=bar
如果将键设置为空字符串,则该键将从会话中删除。
描述 | 定义会话有效的 URL 前缀 |
---|---|
语法 | SessionInclude path |
默认值 | 所有 URL |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | AuthConfig |
状态 | 扩展 |
模块 | mod_session |
SessionInclude
指令允许仅针对特定 URL 前缀使会话有效。这可用于提高网站效率,方法是针对应维护会话的更精确的 URL 空间。默认情况下,目录或位置内的所有 URL 都包含在会话中。
此指令与 HTTP cookie 中的 path 属性具有类似的目的,但不要与该属性混淆。此指令不会设置 path 属性,该属性必须单独配置。