• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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。

    上篇:mod_sed

    下篇:mod_sessioncookie