<-
Apache > HTTP 伺服器 > 文件 > 版本 2.4 > 模組

Apache 模組 mod_auth_form

可用語言: en  |  fr 

說明表單驗證
狀態基本
模組識別碼auth_form_module
來源檔案mod_auth_form.c
相容性可用於 Apache 2.3 及其更新版本

摘要

警告

表單驗證仰賴 mod_session 模組,而這些模組使用 HTTP cookie,因此可能會遭受跨網站腳本攻擊,或對用戶公開潛在的私密資訊。請確保已考慮相關風險,再於伺服器上啟用工作階段功能。

此模組可使用 HTML 登入表單,透過在指定的提供者中查詢用戶,來限制存取。與替代方案相比,HTML 表單需要更多組態,但 HTML 登入表單能為最終用戶提供更友善的體驗。

mod_auth_basic 提供 HTTP 基本驗證,mod_auth_digest 則提供 HTTP摘要驗證。本模組應與至少一個驗證模組(例如 mod_authn_file)和一個授權模組(例如 mod_authz_user)結合使用。

用戶成功驗證後,用戶的登入資訊會儲存在 mod_session 提供的工作階段中。

Support Apache!

主題

指令

Bugfix 核對清單

請參閱

top

基本組態

要使用 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 驗證。指令 AuthFormProviderAuthUserFile 指定要對照所選檔案來檢查使用者名稱和密碼。

指令 SessionSessionCookieName 會將工作階段儲存在瀏覽器上的 HTTP cookie 中。如需有關組態工作階段不同選項的詳細資訊,請參閱 mod_session 的文件。

您可以選擇性地加入 SessionCryptoPassphrase 來建立加密的工作階段 cookie。這需要載入額外的模組 mod_session_crypto

在上述簡單範例中,URL 已由 mod_auth_form 保護,但使用者尚未獲得輸入使用者名稱和密碼的機會。可用的選項包括提供專用的獨立登入頁面以供使用,或提供插入式登入頁面。

top

獨立登入

登入表單可以當成一個獨立頁面來主機,或可以提供插入式登入表單在同一個頁面上。

當將登入設定為一個獨立網頁時,使用 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 指令所指定的網址一般會指向一個網頁,說明使用者其登入嘗試失敗,並且應再試一次。 AuthFormLoginSuccessLocation 指令會指定使用者在成功登入後應被重新導向的網址。

另外,也可以將在成功時重新導向使用者的網址內嵌在登入表單中,如下面的範例。如此一來,相同的 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>
top

內嵌登入

警告

存在一個風險,在特定情況下,使用內嵌登入所設定的登入表單可能會被提交超過一次,揭露其登入憑證給底層執行的應用程式。管理員必須確保底層應用程式已適當地受到保護,避免遭到濫用。如有疑問,請使用獨立的登入設定。

除了使用網站的專屬登入網頁外,也可以將 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=/

錯誤文件網頁應包含一個動作屬性為空的登入表單,如下面的範例所示。這會產生將表單提交至原始受保護網址的效果,而此網頁並不需要知道該網址為何。

內嵌登入表單範例

<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 請求方式回傳給使用者。

top

帶主體保留的內嵌式登入

上述所描述的內嵌式登入技術有一項限制,如果 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 類型和主體是如何嵌入登入表單中將取決於網站內使用的平台與技術。

一種選項是搭配 KeptBodySize 指令使用 mod_include 模組,以及一個合適的 CGI 腳本來將變數嵌入表單。

另一個選項是使用 CGI 腳本或其他動態技術呈現登入表單。

CGI 範例

AuthFormProvider file
ErrorDocument 401 "/cgi-bin/login.cgi"
...
top

登出

若要讓使用者能夠登出特定工作階段,請設定一個由 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=/
top

使用者名稱與密碼

請注意表單送出包括表單資料的 URLEncoding :在本例中為使用者名稱和密碼。因此,您應選取避免在表單送出中 URL 編碼的字元作為使用者名稱和密碼,否則可能會得到意外結果。

top

AuthFormAuthoritative 指令

說明設定是否將授權和驗證傳遞到較低層級的模組
語法AuthFormAuthoritative 開啟|關閉
預設值AuthFormAuthoritative 開啟
內容目錄、.htaccess
覆寫AuthConfig
狀態基本
模組mod_auth_form

通常,AuthFormProvider 中列出的每個授權模組會嘗試驗證使用者,如果在任何提供者中都找不到使用者,則拒絕存取。將 AuthFormAuthoritative 指令明確設定為 關閉 可將驗證和授權同時傳遞給其他非基於提供者的模組,如果沒有 userID規則與提供的 userID 相符。這僅在將 mod_auth_form 與未設定為 AuthFormProvider 指令的第三方模組進行組合時才需要。在使用此類模組時,處理順序是在模組的原始程式碼中確定的,而且不可設定。

top

AuthFormBody 指令

說明如果登入成功,則執行請求主體的表單欄位名稱
語法AuthFormBody 欄位名稱
預設值AuthFormBody httpd_body
內容目錄
狀態基本
模組mod_auth_form
相容性在 Apache HTTP Server 2.3.0 和更新版本中可以使用

AuthFormBody 指令中指定 HTML 欄位的名稱,如果已送出,將包含應該在登入成功後送出的請求主體。

透過使用 AuthFormMethodAuthFormMimetypeAuthFormBody 指令所描述的欄位來填寫表單,網站可以重試可能因登入畫面或逾時中斷的請求。

top

AuthFormDisableNoStore 指令

說明停用登入頁面上的 CacheControl no-store 標頭
語法AuthFormDisableNoStore 開啟|關閉
預設值AuthFormDisableNoStore 關閉
內容目錄
狀態基本
模組mod_auth_form
相容性在 Apache HTTP Server 2.3.0 和更新版本中可以使用

當使用者尚未登入時 AuthFormDisableNoStore 旗標會停用傳送 Cache-Control no-store 標頭和返回的錯誤 401 頁面。標頭的目的是讓 ecmascript 應用程式難以嘗試重新送出登入表單,並將使用者名稱和密碼揭露給後端應用程式。自行停用,風險自負。

top

AuthFormFakeBasicAuth 指令

說明偽造基本驗證標頭
語法AuthFormFakeBasicAuth 開啟|關閉
預設值AuthFormFakeBasicAuth 關閉
內容目錄
狀態基本
模組mod_auth_form
相容性在 Apache HTTP Server 2.3.0 和更新版本中可以使用

AuthFormFakeBasicAuth 旗標決定是否會將 基本驗證 標頭新增到要求標頭。這可用於將使用者名稱和密碼公開給底層應用程式,而底層應用程式不需要知道如何達成登入。

top

AuthFormLocation 指令

說明承載要於登入成功時重定向到的 URL 的表單欄位名稱
語法AuthFormLocation fieldname
預設值AuthFormLocation httpd_location
內容目錄
狀態基本
模組mod_auth_form
相容性在 Apache HTTP Server 2.3.0 和更新版本中可以使用

AuthFormLocation 指令指定 HTML 欄位名稱,如果存在,則將包含瀏覽器要重定向到的 URL(在登入成功時)。

top

AuthFormLoginRequiredLocation 指令

說明在需要登入的情況下要重定向到的頁面 URL
語法AuthFormLoginRequiredLocation url
預設值
內容目錄
狀態基本
模組mod_auth_form
相容性於 Apache HTTP Server 2.3.0 及更新版本中提供。已於 2.4.4 中新增表達式解析器的使用。

AuthFormLoginRequiredLocation 指令指定在使用者未被授權檢視某一頁面時要重定向到的 URL。這個值會利用 ap_expr 解析器進行解析,然後再傳送到用戶端。預設情況下,如果某個使用者未被授權檢視某一頁面,系統將傳回 HTTP 回應碼 HTTP_UNAUTHORIZED,並附帶由 ErrorDocument 指令指定的頁面。此指令會覆寫此預設值。

如果您有專門的登入頁面要重定向使用者,請使用此指令。

top

AuthFormLoginSuccessLocation 指令

說明在登入成功的情況下要重定向到的頁面 URL
語法AuthFormLoginSuccessLocation url
預設值
內容目錄
狀態基本
模組mod_auth_form
相容性於 Apache HTTP Server 2.3.0 及更新版本中提供。已於 2.4.4 中新增表達式解析器的使用。

AuthFormLoginSuccessLocation 指令指定在使用者成功登入時要重定向到的 URL。這個值會利用 ap_expr 解析器進行解析,然後再傳送到用戶端。如果已使用 AuthFormLocation 指令定義包含其他 URL 表單欄位,則會覆寫此指令。

如果您有專門的登入 URL,且您未在登入表單中內嵌目標頁面,請使用此指令。

top

AuthFormLogoutLocation 指令

說明在使用者登出後重新導向到的 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 沒有密碼保護,否則不會顯示該網頁。

top

AuthFormMethod 指令

說明表單欄位名稱,表示執行成功登入後要嘗試請求的方法
語法AuthFormMethod 欄位名稱
預設值AuthFormMethod httpd_方法
內容目錄
狀態基本
模組mod_auth_form
相容性在 Apache HTTP Server 2.3.0 和更新版本中可以使用

AuthFormMethod 指令指定 HTML 欄位名稱,如果存在,將包含成功登入後應提交請求的方法。

透過使用 AuthFormMethodAuthFormMimetypeAuthFormBody 指令所描述的欄位來填寫表單,網站可以重試可能因登入畫面或逾時中斷的請求。

top

AuthFormMimetype 指令

說明表單欄位名稱,表示執行成功登入後要嘗試請求的主體 MIME 類型
語法AuthFormMimetype 欄位名稱
預設值AuthFormMimetype httpd_mime類型
內容目錄
狀態基本
模組mod_auth_form
相容性在 Apache HTTP Server 2.3.0 和更新版本中可以使用

AuthFormMimetype 指令指定 HTML 欄位名稱,如果存在,將包含成功登入後應提交請求的 MIME 類型。

透過使用 AuthFormMethodAuthFormMimetypeAuthFormBody 指令所描述的欄位來填寫表單,網站可以重試可能因登入畫面或逾時中斷的請求。

top

AuthFormPassword 指令

說明表單欄位名稱,表示登入密碼
語法AuthFormPassword 欄位名稱
預設值AuthFormPassword httpd_密碼
內容目錄
狀態基本
模組mod_auth_form
相容性在 Apache HTTP Server 2.3.0 和更新版本中可以使用

AuthFormPassword 指令指定 HTML 欄位名稱,如果存在,將包含用於登入的密碼。

top

AuthFormProvider 指令

說明設定此位置的驗證提供者
語法AuthFormProvider 提供者名稱 [提供者名稱] ...
預設值AuthFormProvider 檔案
內容目錄、.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_dbmmod_authn_filemod_authn_dbdmod_authnz_ldapmod_authn_socache 實作的。

top

AuthFormSitePassphrase 指令

說明繞過流量高的網站的驗證檢查
語法AuthFormSitePassphrase 密語
預設值
內容目錄
狀態基本
模組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 空間內使用此指令。請自行承擔風險。

top

AuthFormSize 指令

說明將解析以取得登入詳細資料之表單在位元組中最大的大小
語法AuthFormSize 大小
預設值AuthFormSize 8192
內容目錄
狀態基本
模組mod_auth_form
相容性在 Apache HTTP Server 2.3.0 和更新版本中可以使用

AuthFormSize 指令指定將解析以找到登入表單的要求主體之最大大小。

如果接收到的登入要求超過此大小,則整個要求將會中止,也會傳回 HTTP 回應碼 HTTP_REQUEST_TOO_LARGE

如果您已使用 AuthFormMethodAuthFormMimetypeAuthFormBody 描述的欄位填入表單,您可能會希望將此欄位設定為與 KeptBodySize 指令類似的某個大小。

top

AuthFormUsername 指令

說明攜有登入使用者名稱的表單欄位名稱
語法AuthFormUsername 欄位名稱
預設值AuthFormUsername httpd_username
內容目錄
狀態基本
模組mod_auth_form
相容性在 Apache HTTP Server 2.3.0 和更新版本中可以使用

AuthFormUsername 指令指定 HTML 欄位的名稱,如果存在,此欄位將包含用於登入的使用者名稱。

可用語言: en  |  fr 

top

註解

注意
此非問與答區段。張貼於此處的意見應專注於改善文件或伺服器的建議,且如果已實作或被認為無效/離題,可能會遭我們的管理員移除。關於如何管理 Apache HTTP 伺服器之問題應轉向我們在 Libera.chat 上的 IRC 頻道 #httpd 提出,或發送至我們的 郵寄清單