Apache HTTP Server 版本 2.4
描述 | 表单身份验证 |
---|---|
状态 | 基础 |
模块标识符 | auth_form_module |
源文件 | mod_auth_form.c |
兼容性 | 在 Apache 2.3 及更高版本中可用 |
表单身份验证依赖于 mod_session
模块,这些模块使用 HTTP cookie,因此可能成为跨站点脚本攻击的受害者,或将潜在的私密信息暴露给客户端。在启用服务器上的会话功能之前,请确保已考虑相关风险。
此模块允许使用 HTML 登录表单通过在给定的提供程序中查找用户来限制访问。与其他方法相比,HTML 表单需要更多的配置,但是 HTML 登录表单可以为最终用户提供更友好的体验。
HTTP 基本身份验证由 mod_auth_basic
提供,HTTP 摘要身份验证由 mod_auth_digest
提供。此模块应与至少一个身份验证模块(例如 mod_authn_file
)和一个授权模块(例如 mod_authz_user
)组合使用。
用户成功验证后,用户的登录详细信息将存储在由 mod_session
提供的会话中。
要使用 mod_auth_form
保护特定 URL,您需要决定将 session 存储在何处,以及将使用什么方法进行身份验证。在此简单示例中,登录详细信息将存储在基于 mod_session_cookie
的会话中,并且将使用 mod_authn_file
对文件进行身份验证。如果身份验证失败,用户将被重定向到表单登录页面。
<Location "/admin"> AuthFormProvider file AuthUserFile "conf/passwd" AuthType form AuthName "/admin" AuthFormLoginRequiredLocation "http://example.com/login.html" Session On SessionCookieName session path=/ Require valid-user </Location>
指令 AuthType
将在设置为 form 值时启用 mod_auth_form
身份验证。指令 AuthFormProvider
和 AuthUserFile
指定应针对所选文件检查用户名和密码。
指令 Session
和 SessionCookieName
会话存储在浏览器上的 HTTP cookie 中。有关配置会话的不同选项的更多信息,请阅读 mod_session
的文档。
您可以选择添加 SessionCryptoPassphrase
来创建加密的会话 cookie。这需要加载额外的模块 mod_session_crypto
。
在上面的简单示例中,一个 URL 已被 mod_auth_form
保护,但用户尚未获得输入用户名和密码的机会。为此目的,可以选择提供一个专用的独立登录页面,或在同一页面上提供内联登录页面。
登录表单可以作为独立页面托管,也可以在同一页面上内联提供。
在将登录配置为独立页面时,应使用 AuthFormLoginRequiredLocation
指令将不成功的身份验证尝试重定向到为此目的由网站创建的登录表单。通常,此登录页面将包含一个 HTML 表单,要求用户提供其用户名和密码。
<form method="POST" action="/dologin.html"> Username: <input type="text" name="httpd_username" value="" /> Password: <input type="password" name="httpd_password" value="" /> <input type="submit" name="login" value="Login" /> </form>
执行实际登录的部分由 form-login-handler 处理。表单的操作应指向此处理程序,该处理程序在 Apache httpd 中配置如下
<Location "/dologin.html"> SetHandler form-login-handler AuthFormLoginRequiredLocation "http://example.com/login.html" AuthFormLoginSuccessLocation "http://example.com/admin/index.html" AuthFormProvider file AuthUserFile "conf/passwd" AuthType form AuthName /admin Session On SessionCookieName session path=/ </Location>
由 AuthFormLoginRequiredLocation
指令指定的 URL 通常会指向一个页面,向用户解释他们的登录尝试失败,并让他们尝试再次登录。 AuthFormLoginSuccessLocation
指令指定用户成功登录后应重定向到的 URL。
或者,可以将重定向到用户的 URL(成功后)嵌入到登录表单中,如下例所示。因此,相同的 form-login-handler 可用于网站的不同区域。
<form method="POST" action="/dologin.html"> Username: <input type="text" name="httpd_username" value="" /> Password: <input type="password" name="httpd_password" value="" /> <input type="submit" name="login" value="Login" /> <input type="hidden" name="httpd_location" value="http://example.com/success.html" /> </form>
存在这样的风险,在某些情况下,使用内联登录配置的登录表单可能会被提交多次,从而将登录凭据泄露给底层运行的应用程序。管理员必须确保底层应用程序已妥善保护,以防止滥用。如有疑问,请使用独立登录配置。
作为为网站提供专用登录页面的替代方案,可以配置 mod_auth_form
以内联方式验证用户,而无需重定向到另一个页面。这允许在登录尝试期间保留当前页面的状态。这在强制执行时间限制会话且会话在用户请求中途超时的情况下很有用。用户可以在原地重新验证,并从他们离开的地方继续操作。
如果未经身份验证的用户尝试访问受 mod_auth_form
保护且未配置 AuthFormLoginRequiredLocation
指令的页面,则会向浏览器返回 HTTP_UNAUTHORIZED 状态代码,指示用户无权查看该页面。
要配置内联身份验证,管理员会使用包含登录表单的自定义错误文档覆盖由 HTTP_UNAUTHORIZED 状态代码返回的错误文档,如下所示
AuthFormProvider file ErrorDocument 401 "/login.shtml" AuthUserFile "conf/passwd" AuthType form AuthName realm AuthFormLoginRequiredLocation "http://example.com/login.html" Session On SessionCookieName session path=/
错误文档页面应包含一个具有空操作属性的登录表单,如下例所示。这将使表单提交到原始受保护的 URL,而无需页面知道该 URL 是什么。
<form method="POST" action=""> Username: <input type="text" name="httpd_username" value="" /> Password: <input type="password" name="httpd_password" value="" /> <input type="submit" name="login" value="Login" /> </form>
当最终用户填写其登录详细信息时,表单将向原始密码保护的 URL 发出 HTTP POST 请求。 mod_auth_form
将拦截此 POST 请求,如果找到用于用户名和密码的 HTML 字段,则用户将登录,并且原始密码保护的 URL 将作为 GET 请求返回给用户。
上面描述的内联登录技术的一个限制是,如果 HTML 表单 POST 导致请求进行身份验证或重新验证,则浏览器发布的原始表单的内容将丢失。根据网站的功能,这可能会给最终用户带来很大的不便。
mod_auth_form
通过允许将原始请求的方法和主体嵌入到登录表单中来解决此问题。如果身份验证成功,Apache httpd 将重新尝试原始方法和主体,从而保留原始请求的状态。
要启用主体保留,请根据以下示例向登录表单添加三个额外的字段。
<form method="POST" action=""> Username: <input type="text" name="httpd_username" value="" /> Password: <input type="password" name="httpd_password" value="" /> <input type="submit" name="login" value="Login" />
<input type="hidden" name="httpd_method" value="POST" /> <input type="hidden" name="httpd_mimetype" value="application/x-www-form-urlencoded" /> <input type="hidden" name="httpd_body" value="name1=value1&name2=value2" />
</form>
原始请求的方法、MIME 类型和主体如何嵌入到登录表单中将取决于网站中使用的平台和技术。
一种选择是使用 mod_include
模块以及 KeptBodySize
指令,以及合适的 CGI 脚本将变量嵌入到表单中。
另一种选择是使用 CGI 脚本或其他动态技术呈现登录表单。
AuthFormProvider file ErrorDocument 401 "/cgi-bin/login.cgi" ...
要使用户能够注销特定会话,请配置一个由 form-logout-handler 处理的页面。任何尝试访问此 URL 的操作都会导致用户名和密码从当前会话中删除,从而有效地注销用户。
通过设置 AuthFormLogoutLocation
指令,可以指定一个 URL,浏览器将在成功注销后重定向到该 URL。此 URL 可能会向用户解释他们已注销,并让用户选择再次登录。
SetHandler form-logout-handler AuthName realm AuthFormLogoutLocation "http://example.com/loggedout.html" Session On SessionCookieName session path=/
请注意,注销用户不会删除会话;它只是从会话中删除用户名和密码。如果这导致会话为空,则最终效果将是删除该会话,但这并非保证。如果您想保证删除会话,请将 SessionMaxAge
指令设置为一个较小的值,例如 1(将指令设置为零表示没有会话年龄限制)。
SetHandler form-logout-handler AuthFormLogoutLocation "http://example.com/loggedout.html" Session On SessionMaxAge 1 SessionCookieName session path=/
请注意,表单提交涉及对表单数据进行 URL 编码:在本例中为用户名和密码。因此,您应该选择不会在表单提交中进行 URL 编码的用户名和密码,否则您可能会得到意外的结果。
描述 | 设置是否将授权和身份验证传递到更低级别的模块 |
---|---|
语法 | AuthFormAuthoritative On|Off |
默认值 | AuthFormAuthoritative On |
上下文 | directory, .htaccess |
覆盖 | AuthConfig |
状态 | 基础 |
模块 | mod_auth_form |
通常,AuthFormProvider
中列出的每个授权模块都会尝试验证用户,如果在任何提供者中都找不到用户,则会拒绝访问。将 AuthFormAuthoritative
指令显式设置为 Off
允许在没有 userID 或规则与提供的 userID 匹配的情况下,将身份验证和授权传递给其他非提供者模块。这只有在将 mod_auth_form
与未配置 AuthFormProvider
指令的第三方模块结合使用时才需要。使用此类模块时,处理顺序由模块的源代码确定,不可配置。
描述 | 承载请求主体名称的表单字段,该请求主体将在成功登录后尝试 |
---|---|
语法 | AuthFormBody 字段名 |
默认值 | AuthFormBody httpd_body |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用 |
AuthFormBody
指令指定 HTML 字段的名称,如果存在,则将包含在登录成功时要提交的请求主体。
通过使用 AuthFormMethod
、AuthFormMimetype
和 AuthFormBody
描述的字段填充表单,网站可以重试可能因登录屏幕或会话超时而中断的请求。
描述 | 禁用登录页面上的 CacheControl no-store 标头 |
---|---|
语法 | AuthFormDisableNoStore On|Off |
默认值 | AuthFormDisableNoStore Off |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用 |
AuthFormDisableNoStore
标志禁用向用户未登录时返回的错误 401 页面发送 Cache-Control no-store
标头。该标头的目的是使 ecmascript
应用程序难以尝试重新提交登录表单,并将用户名和密码泄露给后端应用程序。自行承担风险禁用。
描述 | 伪造基本身份验证标头 |
---|---|
语法 | AuthFormFakeBasicAuth On|Off |
默认值 | AuthFormFakeBasicAuth Off |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用 |
AuthFormFakeBasicAuth
标志确定是否将 基本身份验证
标头添加到请求标头。这可用于将用户名和密码公开给底层应用程序,而无需底层应用程序了解登录是如何实现的。
描述 | 承载 URL 名称的表单字段,该 URL 将在成功登录后重定向 |
---|---|
语法 | AuthFormLocation 字段名 |
默认值 | AuthFormLocation httpd_location |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用 |
AuthFormLocation
指令指定 HTML 字段的名称,如果存在,则将包含在登录成功时将浏览器重定向到的 URL。
描述 | 需要登录时要重定向到的页面的 URL |
---|---|
语法 | AuthFormLoginRequiredLocation url |
默认值 | 无 |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用。表达式解析器的使用已在 2.4.4 中添加。 |
AuthFormLoginRequiredLocation
指令指定如果用户无权查看页面,则要重定向到的 URL。该值在发送到客户端之前使用 ap_expr 解析器进行解析。默认情况下,如果用户无权查看页面,则将返回 HTTP 响应代码 HTTP_UNAUTHORIZED
,以及 ErrorDocument
指令指定的页面。此指令会覆盖此默认值。
如果您有一个专用的登录页面来重定向用户,请使用此指令。
描述 | 用户成功登录后要重定向到的页面的 URL |
---|---|
语法 | AuthFormLoginSuccessLocation url |
默认值 | 无 |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用。表达式解析器的使用已在 2.4.4 中添加。 |
AuthFormLoginSuccessLocation
指令指定用户成功登录后要重定向到的 URL。该值在发送到客户端之前使用 ap_expr 解析器进行解析。如果已定义一个表单字段,其中包含使用 AuthFormLocation
指令定义的另一个 URL,则此指令可以被覆盖。
如果您有一个专用的登录 URL,并且您没有将目标页面嵌入到登录表单中,请使用此指令。
描述 | 用户注销后要重定向到的 URL |
---|---|
语法 | AuthFormLogoutLocation uri |
默认值 | 无 |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用。表达式解析器的使用已在 2.4.4 中添加。 |
AuthFormLogoutLocation
指令指定用户尝试注销时要重定向到的服务器上页面的 URL。该值在发送到客户端之前使用 ap_expr 解析器进行解析。
当访问由处理程序 form-logout-handler
提供服务的 URI 时,将向最终用户显示此指令指定的页面。例如
<Location "/logout"> SetHandler form-logout-handler AuthFormLogoutLocation "http://example.com/loggedout.html" Session on #... </Location>
尝试访问 URI /logout/ 将导致用户注销,并将显示页面 /loggedout.html。确保页面 loggedout.html 未受密码保护,否则将不会显示该页面。
描述 | 承载请求方法名称的表单字段,该请求方法将在成功登录后尝试 |
---|---|
语法 | AuthFormMethod 字段名 |
默认值 | AuthFormMethod httpd_method |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用 |
AuthFormMethod
指令指定 HTML 字段的名称,如果存在,则将包含在登录成功时要提交的请求方法。
通过使用 AuthFormMethod
、AuthFormMimetype
和 AuthFormBody
描述的字段填充表单,网站可以重试可能因登录屏幕或会话超时而中断的请求。
描述 | 承载请求主体 MIME 类型的表单字段名称,该请求主体将在成功登录后尝试 |
---|---|
语法 | AuthFormMimetype 字段名 |
默认值 | AuthFormMimetype httpd_mimetype |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用 |
AuthFormMimetype
指令指定 HTML 字段的名称,如果存在,则将包含在登录成功时要提交的请求的 MIME 类型。
通过使用 AuthFormMethod
、AuthFormMimetype
和 AuthFormBody
描述的字段填充表单,网站可以重试可能因登录屏幕或会话超时而中断的请求。
描述 | 承载登录密码的表单字段名称 |
---|---|
语法 | AuthFormPassword 字段名 |
默认值 | AuthFormPassword httpd_password |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用 |
AuthFormPassword
指令指定 HTML 字段的名称,如果存在,则将包含用于登录的密码。
描述 | 设置此位置的身份验证提供者 |
---|---|
语法 | AuthFormProvider 提供者名称 [提供者名称] ... |
默认值 | AuthFormProvider file |
上下文 | directory, .htaccess |
覆盖 | AuthConfig |
状态 | 基础 |
模块 | mod_auth_form |
AuthFormProvider
指令设置用于对此位置进行用户身份验证的提供者。默认的 file
提供者由 mod_authn_file
模块实现。确保服务器中存在所选的提供者模块。
<Location "/secure"> AuthType form AuthName "private area" AuthFormProvider dbm AuthDBMType SDBM AuthDBMUserFile "/www/etc/dbmpasswd" Require valid-user #... </Location>
提供者由 mod_authn_dbm
、mod_authn_file
、mod_authn_dbd
、mod_authnz_ldap
和 mod_authn_socache
实现。
描述 | 绕过高流量站点的身份验证检查 |
---|---|
语法 | AuthFormSitePassphrase secret |
默认值 | 无 |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用 |
AuthFormSitePassphrase
指令指定一个密码短语,如果该密码短语存在于用户会话中,则 Apache httpd 会绕过对给定 URL 的身份验证检查。它可用于高流量网站,以减少对身份验证基础设施造成的负载。
可以通过将此指令添加到 form-login-handler 的配置中,将密码短语插入用户会话。无论是否指定密码短语,form-login-handler 本身始终会运行身份验证检查。
如果会话通过使用 mod_session_cookie
公开给用户,并且会话未通过 mod_session_crypto
进行保护,则密码短语可能会通过字典攻击暴露。无论会话如何配置,请确保此指令未在可能暴露私人用户数据或可能进行敏感交易的 URL 空间内使用。自行承担风险使用。
描述 | 将解析以查找登录详细信息的表单的最大大小(以字节为单位) |
---|---|
语法 | AuthFormSize size |
默认值 | AuthFormSize 8192 |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用 |
AuthFormSize
指令指定将解析以查找登录表单的请求主体的最大大小。
如果到达的登录请求超过此大小,则整个请求将使用 HTTP 响应代码 HTTP_REQUEST_TOO_LARGE
终止。
如果您使用 AuthFormMethod
、AuthFormMimetype
和 AuthFormBody
描述的字段填充了表单,您可能希望将此字段设置为与 KeptBodySize
指令类似的大小。
描述 | 承载登录用户名的表单字段名称 |
---|---|
语法 | AuthFormUsername 字段名 |
默认值 | AuthFormUsername httpd_username |
上下文 | 目录 |
状态 | 基础 |
模块 | mod_auth_form |
兼容性 | 在 Apache HTTP Server 2.3.0 及更高版本中可用 |
AuthFormUsername
指令指定 HTML 字段的名称,如果存在,则将包含用于登录的用户名。