Apache HTTP 伺服器版本 2.4
說明 | 表單驗證 |
---|---|
狀態 | 基本 |
模組識別碼 | 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
提供的工作階段中。
要使用 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
指令所指定的網址一般會指向一個網頁,說明使用者其登入嘗試失敗,並且應再試一次。 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>
存在一個風險,在特定情況下,使用內嵌登入所設定的登入表單可能會被提交超過一次,揭露其登入憑證給底層執行的應用程式。管理員必須確保底層應用程式已適當地受到保護,避免遭到濫用。如有疑問,請使用獨立的登入設定。
除了使用網站的專屬登入網頁外,也可以將 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 請求方式回傳給使用者。
上述所描述的內嵌式登入技術有一項限制,如果 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 腳本或其他動態技術呈現登入表單。
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=/
請注意表單送出包括表單資料的 URLEncoding :在本例中為使用者名稱和密碼。因此,您應選取避免在表單送出中 URL 編碼的字元作為使用者名稱和密碼,否則可能會得到意外結果。
說明 | 設定是否將授權和驗證傳遞到較低層級的模組 |
---|---|
語法 | AuthFormAuthoritative 開啟|關閉 |
預設值 | AuthFormAuthoritative 開啟 |
內容 | 目錄、.htaccess |
覆寫 | AuthConfig |
狀態 | 基本 |
模組 | mod_auth_form |
通常,AuthFormProvider
中列出的每個授權模組會嘗試驗證使用者,如果在任何提供者中都找不到使用者,則拒絕存取。將 AuthFormAuthoritative
指令明確設定為 關閉
可將驗證和授權同時傳遞給其他非基於提供者的模組,如果沒有 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 開啟|關閉 |
預設值 | AuthFormDisableNoStore 關閉 |
內容 | 目錄 |
狀態 | 基本 |
模組 | mod_auth_form |
相容性 | 在 Apache HTTP Server 2.3.0 和更新版本中可以使用 |
當使用者尚未登入時 AuthFormDisableNoStore
旗標會停用傳送 Cache-Control no-store 標頭和返回的錯誤 401 頁面。標頭的目的是讓 ecmascript
應用程式難以嘗試重新送出登入表單,並將使用者名稱和密碼揭露給後端應用程式。自行停用,風險自負。
說明 | 偽造基本驗證標頭 |
---|---|
語法 | AuthFormFakeBasicAuth 開啟|關閉 |
預設值 | AuthFormFakeBasicAuth 關閉 |
內容 | 目錄 |
狀態 | 基本 |
模組 | mod_auth_form |
相容性 | 在 Apache HTTP Server 2.3.0 和更新版本中可以使用 |
AuthFormFakeBasicAuth
旗標決定是否會將 基本驗證
標頭新增到要求標頭。這可用於將使用者名稱和密碼公開給底層應用程式,而底層應用程式不需要知道如何達成登入。
說明 | 承載要於登入成功時重定向到的 URL 的表單欄位名稱 |
---|---|
語法 | AuthFormLocation fieldname |
預設值 | 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_方法 |
內容 | 目錄 |
狀態 | 基本 |
模組 | mod_auth_form |
相容性 | 在 Apache HTTP Server 2.3.0 和更新版本中可以使用 |
AuthFormMethod
指令指定 HTML 欄位名稱,如果存在,將包含成功登入後應提交請求的方法。
透過使用 AuthFormMethod
、AuthFormMimetype
和 AuthFormBody
指令所描述的欄位來填寫表單,網站可以重試可能因登入畫面或逾時中斷的請求。
說明 | 表單欄位名稱,表示執行成功登入後要嘗試請求的主體 MIME 類型 |
---|---|
語法 | AuthFormMimetype 欄位名稱 |
預設值 | AuthFormMimetype httpd_mime類型 |
內容 | 目錄 |
狀態 | 基本 |
模組 | mod_auth_form |
相容性 | 在 Apache HTTP Server 2.3.0 和更新版本中可以使用 |
AuthFormMimetype
指令指定 HTML 欄位名稱,如果存在,將包含成功登入後應提交請求的 MIME 類型。
透過使用 AuthFormMethod
、AuthFormMimetype
和 AuthFormBody
指令所描述的欄位來填寫表單,網站可以重試可能因登入畫面或逾時中斷的請求。
說明 | 表單欄位名稱,表示登入密碼 |
---|---|
語法 | AuthFormPassword 欄位名稱 |
預設值 | AuthFormPassword httpd_密碼 |
內容 | 目錄 |
狀態 | 基本 |
模組 | mod_auth_form |
相容性 | 在 Apache HTTP Server 2.3.0 和更新版本中可以使用 |
AuthFormPassword
指令指定 HTML 欄位名稱,如果存在,將包含用於登入的密碼。
說明 | 設定此位置的驗證提供者 |
---|---|
語法 | 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_dbm
、mod_authn_file
、mod_authn_dbd
、mod_authnz_ldap
和 mod_authn_socache
實作的。
說明 | 繞過流量高的網站的驗證檢查 |
---|---|
語法 | 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 空間內使用此指令。請自行承擔風險。
說明 | 將解析以取得登入詳細資料之表單在位元組中最大的大小 |
---|---|
語法 | AuthFormSize 大小 |
預設值 | 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 欄位的名稱,如果存在,此欄位將包含用於登入的使用者名稱。