描述: | 会话支持 |
---|---|
状态: | 延期 |
模块标识符: | session_module |
源文件: | mod_session.c |
兼容性: | 在Apache 2.3及更高版本中可用 |
会话模块使用HTTP cookie,因此可能成为跨站点脚本攻击的受害者,或向客户端公开潜在的私人信息。在服务器上启用会话功能之前,请确保已考虑到相关风险。
该模块为每个用户会话界面的服务器范围提供支持。会话可用于跟踪用户是否已登录,或用于其他每个用户的信息,这些信息应在请求中保持可用。
会话可以存储在服务器上,也可以存储在浏览器上。会话也可以选择加密,以提高安全性。这些功能除了分为以下几个模块
mod_session
:mod_session_crypto
,
mod_session_cookie
和mod_session_dbd
。根据服务器要求,将适当的模块加载到服务器中(在编译时静态地或通过LoadModule
伪指令动态地)。
可以从依赖于该会话的其他模块中操纵会话,或者可以根据需要使用环境变量和HTTP标头从中读取会话或将会话写入会话。
会话界面的核心是一个键和值对表,可以跨浏览器请求进行访问。根据应用程序使用会话的需要,可以将这些对设置为任何有效的字符串。
“会话”是 包含HTML规范定义的这些键值对的application / x-www-form-urlencoded字符串 。
在将会话写入管理员定义的存储机制之前,可以选择对会话进行加密和base64编码。
会话接口主要是为其他服务器模块(例如)使用而开发的mod_auth_form
,但是可以选择通过HTTP_SESSION环境变量为基于CGI的应用程序授予对会话内容的访问权限。会话可以选择通过插入包含新会话参数的HTTP响应标头来修改和/或更新。
可以将Apache配置为跟踪存储在特定服务器或一组服务器上的每个用户会话。此功能类似于典型应用程序服务器中可用的会话。
如果配置了会话,则使用存储在cookie中的会话ID进行跟踪,或者从典型的GET请求中发现的URL查询字符串中嵌入的参数中提取会话ID。
由于会话的内容专门存储在服务器上,因此期望会话内容的私密性。如果存在大量会话,或者大量Web服务器必须彼此共享会话,这确实会对性能和资源产生影响。
该mod_session_dbd
模块允许通过来将用户会话存储在SQL数据库中mod_dbd
。
在跟踪服务器上的会话过于耗费资源或不方便的高流量环境中,可以选择将会话的内容存储在客户端浏览器的cookie中。
这样做的好处是,服务器上需要最少的资源来跟踪会话,并且服务器场中的多个服务器无需共享会话信息。
但是,会话的内容会暴露给客户端,从而带来失去隐私的风险。该
mod_session_crypto
模块可配置会话写入到客户端之前会话的内容进行加密。
将mod_session_cookie
允许用户会话上的HTTP cookie中的浏览器的存储空间。
创建会话就像打开会话并确定将在何处存储会话一样简单。在此示例中,会话将存储在浏览器中的Cookie中session
。
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
应包含value 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
mod_session
模块和相应的配置。
mod_proxy
SessionHeader
指令用于定义HTTP请求标头,则该会话将被编码为application / x-www-form-urlencoded字符串,将对应用程序可用。如果响应中提供了相同的标头,则此响应标头的值将用于替换会话。如上所述,任何加密或解密,以及从所选存储机制读取会话或将会话写入所选存储机制均由mod_session
模块和相应的配置来处理
。描述: | 为当前目录或位置启用会话 |
---|---|
句法: | Session On|Off |
默认: | Session Off |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
覆写: | 验证配置 |
状态: | 延期 |
模块: | mod_session |
该Session
指令启用目录或位置容器的会话。其他指令控制会话的存储位置以及如何维护隐私。
描述: | 控制是否将会话内容写入 HTTP_SESSION环境变量 |
---|---|
句法: | SessionEnv On|Off |
默认: | SessionEnv Off |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
覆写: | 验证配置 |
状态: | 延期 |
模块: | mod_session |
如果设置为On,则SessionEnv
伪指令使会话的内容写入名为HTTP_SESSION的CGI环境变量。
该字符串以URL查询格式编写,例如:
key1=foo&key3=bar
描述: | 定义将忽略会话的URL前缀 |
---|---|
句法: | SessionExclude path |
默认: | none |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
状态: | 延期 |
模块: | mod_session |
该SessionExclude
指令仅允许相对于URL前缀禁用会话。通过定位应为其维护会话的更精确的URL空间,这可用于使网站更高效。默认情况下,目录或位置中的所有URL都包含在会话中。该
SessionExclude
指令优先于该
SessionInclude
指令。
此伪指令与HTTP cookie中的path属性具有相似的用途,但请勿与此属性混淆。该伪指令未设置路径属性,该路径属性必须单独配置。
描述: | 定义会话的过期时间可能会改变的秒数,而无需更新会话 |
---|---|
句法: | SessionExpiryUpdateInterval interval |
默认: | SessionExpiryUpdateInterval 0 (always update) |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
状态: | 延期 |
模块: | mod_session |
兼容性: | 在Apache 2.4.41及更高版本中可用 |
该SessionExpiryUpdateInterval
指令允许会话避免仅在到期时间已更改的情况下与写入每个请求的会话相关的成本。使用时,可以使用它来提高网站的效率或减少数据库的负载
mod_session_dbd
。如果会话中存储的数据已更改或过期更改的时间超过配置的间隔,则始终会写入会话。
将时间间隔设置为零将禁用此伪指令,并且会话到期将针对每个请求进行刷新。
该指令仅在与SessionMaxAge
启用时才
有效。只有在会话中存储的数据已更改时,才会写入没有到期的会话。
由于会话到期可能不会随每个请求刷新,因此会话有可能提前到秒间隔。使用较小的时间间隔通常可以提供足够的节省,同时对到期分辨率的影响最小。
描述: | 从给定的HTTP响应标头导入会话更新 |
---|---|
句法: | SessionHeader header |
默认: | none |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
覆写: | 验证配置 |
状态: | 延期 |
模块: | mod_session |
该SessionHeader
指令定义HTTP响应标头的名称(如果存在),将对其进行解析并将其写入当前会话。
标头值应采用URL查询格式,例如:
key1=foo&key2=&key3=bar
如果将密钥设置为空字符串,则将从会话中删除该密钥。