mod_session
描述: | Session 支持 |
状态: | 延期 |
模块标识符: | session_module |
源文件: | mod_session.c |
兼容性: | 可在 Apache 2.3 及更高版本中使用 |
摘要
警告
session 模块使用 HTTP cookies,因此可能成为 Cross Site Scripting 攻击的受害者,或者将潜在的私人信息暴露给 clients。在服务器上启用 session 功能之前,请确保已考虑相关风险。
此模块为每个用户的 session 接口提供服务器支持。会话可用于跟踪用户是否已登录,或用于跨请求应保持可用的其他每用户信息。
会话可以存储在服务器上,也可以存储在浏览器中。还可以选择加密会话以增加安全性。除了mod_session之外,这些 features 还分为几个模块;mod_sessioncrypto,mod_sessioncookie和mod_session_dbd。根据服务器要求,将适当的模块加载到服务器中(静态地在编译 time 时或通过LoadModule指令动态)。
可以从依赖于 session 的其他模块操作会话,或者可以根据需要使用环境变量和 HTTP _header 读取和写入 session。
什么是 session?
session 接口的核心是 table 和 value 对,可以跨浏览器请求访问。这些对可以设置为任何有效的 string,根据 application 的需要使用 session。
“session”是一个application/x-www-form-urlencoded string,包含这些 key value 对,由HTML 规范定义。
根据管理员的定义,在写入存储机制之前,可以选择对 session 进行加密和 base64 编码。
谁可以使用 session?
session 接口主要是为其他服务器模块(如mod_auth_form)使用而开发的,但是可以选择通过 HTTPSESSION 环境变量授予基于 CGI 的 applications 访问 session 的内容的权限。通过插入包含新的 session 参数的 HTTP 响应头,可以选择通过更新 and/or 来更新会话。
在服务器上保持会话
Apache 可以配置为跟踪存储在特定服务器或服务器组上的每个用户会话。此功能类似于典型的 application 服务器中可用的会话。
如果已配置,则会通过使用存储在 cookie 中的 session ID 来跟踪会话,或者从 URL 查询 string 中嵌入的参数中提取会话,如典型的 GET 请求中所示。
由于 session 的内容专门存储在服务器上,因此期望 session 的内容具有隐私性。如果存在大量会话,或者大量网络服务器必须彼此共享会话,则确实存在性能和资源影响。
mod_session_dbd模块允许通过mod_dbd在 SQL 数据库中存储用户会话。
在浏览器上保持会话
在高流量环境中,跟踪服务器上的 session 太耗费资源或不方便,可选择在 client 浏览器的 cookie 中存储 session 的内容。
这具有以下优点:服务器上需要最少的资源来跟踪会话,并且服务器场内的多个服务器不需要共享 session 信息。
然而,session 的内容暴露给客户端,相应的隐私风险也随之降低。可以将mod_sessioncrypto模块配置为在将 session 写入 client 之前加密 session 的内容。
mod_sessioncookie允许在 HTTP cookie 中在浏览器上存储用户会话。
基本例子
创建 session 就像打开 session 一样简单,并决定 session 将被存储在何处。在这个 example 中,session 将存储在浏览器中,名为session
的 cookie 中。
基于浏览器的 session
Session On SessionCookieName session path=/
除非可以写入或读取,否则 session 无用。以下 example 显示了如何通过使用名为X-Replace-Session
的预定 HTTP 响应头将值注入 session。
写给 session
Session On SessionCookieName session path=/ SessionHeader X-Replace-Session
标头应包含以与 URL 中的查询 string 相同的格式表示的 name value 对,如下面的 example 中所示。将 key 设置为空 string 可以从 session 中删除 key。
CGI 写给 session
#!/bin/bash echo "Content-Type: text/plain" echo "X-Replace-Session: key1=foo&key2=&key3=bar" echo env
如果已配置,则可以从 HTTPSESSION 环境变量中读回 session。默认情况下,session 保持私有,因此必须使用SessionEnv指令明确启用。
阅读 session
Session On SessionEnv On SessionCookieName session path=/ SessionHeader X-Replace-Session
读取后,CGI 变量HTTP_SESSION
应包含 value key1=foo&key3=bar
。
Session 隐私
使用浏览器的“show cookies”feature,你会看到 session 的清晰文本表示。如果最终用户不需要意识到 session 的内容,或者第三方可能未经授权访问 session 中的数据,则这可能是一个问题。
在使用mod_sessioncrypto模块将 session 放入浏览器之前,可以选择加密 session 的内容。
基于浏览器的加密 session
Session On SessionCryptoPassphrase secret SessionCookieName session path=/
session 将在加载时自动解密,并在 Apache 保存时加密,使用 session 的底层 application 不需要知道正在进行加密。
存储在服务器上而不是浏览器上的会话也可以根据需要进行加密,从而提供隐私,使用mod_session_dbd模块在服务器场中的 Web 服务器之间共享潜在的敏感信息。
Cookie 隐私
HTTP cookie 机制还提供隐私功能,例如仅限 cookie 传输到 SSL 保护页面的功能,或防止基于浏览器的 javascript 访问 cookie 的内容。
警告
某些 HTTP cookie 隐私 features 是 non-standard,或者不是跨浏览器一致地实现的。 session 模块允许您设置 cookie 参数,但不保证浏览器会尊重隐私。如果需要考虑安全性,请使用mod_sessioncrypto加密 session 的内容,或者使用mod_session_dbd模块在服务器上存储 session。
标准的 cookie 参数可以在 cookie 的 name 之后指定,如下面的 example 所示。
设置 cookie 参数
Session On SessionCryptoPassphrase secret SessionCookieName session path=/private;domain=example.com;httponly;secure;
如果 Apache 服务器构成后端源服务器的前端,则可以使用SessionCookieRemove指令从传入的 HTTP headers 中删除 session cookies。这使得 session cookies 的内容无法从后端服务器访问。
Session 支持身份验证
在许多 application 服务器中,身份验证模块可以在登录后使用 session 存储用户名和密码。mod_auth_form在 session 中保存用户的登录名和密码。
基于表单的身份验
Session On SessionCryptoPassphrase secret SessionCookieName session path=/ AuthFormProvider file AuthUserFile "conf/passwd" AuthType form AuthName "realm" #...
有关文档和完整示例,请参见mod_auth_form模块。
将会话与外部 Applications 集成
在 order 中,会话有用,必须能够与外部 applications 共享 session 的内容,并且外部 application 必须能够编写自己的 session。
典型的 example 可能是一个 application,用于更改mod_auth_form设置的用户密码。此应用程序需要从 session 读取当前用户名和密码,对用户密码进行必要的更改,然后将新密码写入 order 中的 session 以提供到新密码的无缝转换。
第二个 example 可能涉及一个 application,它为第一个 time 注册一个新用户。注册完成后,用户名和密码将写入 session,从而无缝过渡到登录。
- Apache 模块
服务器中需要访问 session 的模块可以使用 order 中的 mod_session.h API 来读取和写入 session。此机制由 mod_auth_form 等模块使用。 - CGI 程序和脚本语言
在 Web 服务器中运行的应用程序可以选择从 HTTPSESSION 环境变量中检索 session 的 value。 session 应编码为 application/x-www-form-urlencoded string,如 HTML 规范所述。环境变量由 SessionEnv 指令的设置控制。脚本可以通过返回带有 SessionHeader 指令设置的 name 的 application/x-www-form-urlencoded 响应头来写入 session。在这两种情况下,任何加密或解密,以及从 session 读取 session 或将 session 写入所选存储机制都由 mod_session 模块和相应的 configuration 处理。 - 背后的应用
如果使用 SessionHeader 指令定义 HTTP 请求标头,则编码为 application/x-www-form-urlencoded string 的 session 将可用于 application。如果响应中提供了相同的标头,则此响应标头的 value 将用于替换 session。如上所述,任何加密或解密,以及从 session 读取 session 或将 session 写入所选存储机制都由 mod_session 模块和相应的 configuration 处理。 - 独立应用程序 Applications 可能会选择在 Apache HTTP 服务器的控制之外操纵 session。在这种情况下,application 负责从所选存储机制中读取 session,解密 session,更新 session,加密 session 并将 session 写入所选的存储机制,视情况而定。
Session 指令
描述: | 为当前目录或位置启用 session |
句法: | Session On\|Off |
默认: | Session Off |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_session |
Session
指令为目录或位置容器启用 session。进一步的指令控制着 session 的存储位置以及如何保持隐私。
SessionEnv 指令
描述: | 控制是否将 session 的内容写入 HTTPSESSION 环境变量 |
句法: | SessionEnv On\|Off |
默认: | SessionEnv Off |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_session |
如果设置为 On,则SessionEnv
指令会将 session 的内容写入名为 HTTPSESSION 的 CGI 环境变量。
string 以 URL 查询格式编写,用于 example:
key1=foo&key3=bar
SessionExclude 指令
描述: | 定义忽略 session 的 URL 前缀 |
句法: | SessionExclude path |
默认: | none |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_session |
SessionExclude
指令仅允许相对于 URL 前缀禁用会话。通过定位应该维护 session 的更精确的 URL 空间,这可以用于提高网站的效率。默认情况下,目录或位置中的所有 URL 都包含在 session 中。SessionExclude指令优先于SessionInclude指令。
警告
该指令与 HTTP cookies 中的 path 属性具有类似的目的,但不应与此属性混淆。该指令不设置 path 属性,必须单独配置。
SessionExpiryUpdateInterval 指令
描述: | 定义 session 的到期可能会在没有更新 session 的情况下更改的秒数 |
句法: | SessionExpiryUpdateInterval interval |
默认: | SessionExpiryUpdateInterval 0(always update) |
Context: | server config,virtual host,directory,.htaccess |
状态: | 延期 |
模块: | mod_session |
兼容性: | 可在 Apache 2.4.41 及更高版本中使用 |
只有到期 time 已更改时,SessionExpiryUpdateInterval
指令允许会话避免与写入 session 每个请求相关的成本。当使用mod_session_dbd时,这可用于提高网站效率或减少数据库的负载。如果存储在 session 中的数据已更改或者到期时间已超过配置的时间间隔,则始终会写入 session。
将间隔设置为零会禁用此指令,并且会为每个请求刷新 session 有效期。
该指令仅在与SessionMaxAge结合使用 session 到期时才有效。只有当存储在 session 中的数据发生变化时,才会写入没有过期的会话。
警告
由于每次请求都不能刷新 session 到期,因此会话可能会提前到达间隔秒。使用较小的间隔通常可以提供足够的节省,同时对到期分辨率的影响最小。
SessionHeader 指令
描述: | Import session 从给定的 HTTP 响应头更新 |
句法: | SessionHeader header |
默认: | none |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_session |
SessionHeader
指令定义 HTTP 响应头的 name,如果存在,将解析并写入当前的 session。
对于 example,标题 value 应采用 URL 查询格式:
key1=foo&key2=&key3=bar
如果将 key 设置为空 string,那么 key 将从 session 中删除。
SessionInclude 指令
描述: | 定义 session 有效的 URL 前缀 |
句法: | SessionInclude path |
默认: | all URLs |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_session |
SessionInclude
指令允许会话仅对特定的 URL 前缀有效。通过定位应该维护 session 的更精确的 URL 空间,这可以用于提高网站的效率。默认情况下,目录或位置中的所有 URL 都包含在 session 中。
警告
该指令与 HTTP cookies 中的 path 属性具有类似的目的,但不应与此属性混淆。该指令不设置 path 属性,必须单独配置。
SessionMaxAge 指令
描述: | 定义 session 的最大年龄(以秒为单位) |
句法: | SessionMaxAge maxage |
默认: | SessionMaxAge 0 |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_session |
SessionMaxAge
指令定义 session 将保持有效的 time 限制。保存 session 时,将重置此 time 限制,并且可以继续现有的 session。如果 session 超过此限制但没有请求服务器刷新 session,则 session 将 time 超时并被删除。如果 session 用于存储用户登录详细信息,则会在给定 time 之后自动 logging 用户。
将 maxage 设置为零会禁用 session expiry。