Apache HTTP Server 版本 2.4
說明 | 會話支援 |
---|---|
狀態 | 擴充 |
模組識別 | session_module |
原始檔 | mod_session.c |
相容性 | 在 Apache 2.3 和更新版本中可用 |
會話模組使用 HTTP Cookie,因此可能會遭受跨網站指令碼攻擊,或將潛在的私人資訊公開給客戶端。請在為伺服器啟用會話功能前,確保已考慮相關風險。
這個模組提供支援,可透過伺服器建立使用者會話介面。會話可用於追蹤使用者是否已登入,或其他每個使用者的資訊,這些資訊應在各個要求之間保持有效。
會話可以儲存在伺服器或瀏覽器。會話也可以在需要時加密以增加安全性。這些功能分為幾個模組,已新增至 mod_session
中;mod_session_crypto
、mod_session_cookie
和 mod_session_dbd
。根據伺服器需求,將適當的模組載入伺服器(在編譯時靜態載入,或透過 LoadModule
指令動態載入)。
會話可以透過其他依賴會話的模組進行處理,或者可以使用環境變數和 HTTP 標頭讀取和寫入會話,視情況而定。
階段介面的核心是一張鍵值對表格,並可以在瀏覽器要求中存取。依據使用階段的應用程式需要,這些對值可以設定為任何有效的字串。
「階段」是一個 application/x-www-form-urlencoded 字串,其中包含這些定義在 HTML 規範 中的鍵值對。
階段在寫入儲存機制之前,可以選擇先進行加密和 base64 編碼,由管理員定義。
階段介面主要是開發給其他伺服器模組使用,例如 mod_auth_form
,不過也可以選擇授與基於 CGI 的應用程式存取階段內容,方法是透過 HTTP_SESSION 環境變數。階段可以使用包含新階段參數的 HTTP 回應標頭進行修改及/或更新。
可以設定 Apache 在特定伺服器或伺服器群組上追蹤每個使用者的階段。此功能類似在一般應用程式伺服器中提供的階段。
如果已設定組態,階段會透過儲存在 cookie 中的階段 ID 追蹤,或從 URL 查詢字串內嵌的參數中擷取,就像一般 GET 要求找到的一樣。
由於階段內容完全儲存在伺服器上,所以預期階段內容具有隱私性。如果出現大量階段,或大量網路伺服器必須彼此分享階段,這會對效能和資源造成影響。
mod_session_dbd
模組允許透過 mod_dbd
將使用階段儲存在 SQL 資料庫中。
在流量大的環境中,在伺服器上追蹤階段會耗費太多資源或不方便,因此改為選擇將階段內容儲存在客戶端瀏覽器的 cookie 內。
這具有優點,也就是在伺服器上追蹤階段所需的資源很小,而伺服器農場內的數個伺服器不需要分享階段資訊。
然而,該會話內容會揭露給用戶端,這伴隨著隱私損失的風險。你可以設定 mod_session_crypto
模組,在將會話寫入用戶端之前先對會話內容進行加密。
mod_session_cookie
允許在 HTTP Cookie 中於瀏覽器上儲存使用者會話。
若要建立會話,只要開啟會話,並決定會話的儲存位置即可,十分簡單。在此範例中,會話會儲存在瀏覽器上名為 session
的 Cookie 中。
Session On SessionCookieName session path=/
除非會話可以寫入或讀取,否則會話便派不上用場。以下範例顯示如何透過名為 X-Replace-Session
的預先定義 HTTP 回應標頭,將值注入會話。
Session On SessionCookieName session path=/ SessionHeader X-Replace-Session
標頭應包含名稱值對,格式與網址中的查詢字串相同,如下面的範例。將金鑰設定為空字串會將金鑰從會話中移除。
#!/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
應包含值 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 隱私權功能屬於非標準,或者並未在所有瀏覽器中一致地實作。session 模組可讓您設定 Cookie 參數,但無法保證瀏覽器會尊重隱私權。如果您擔憂安全性,請使用 mod_session_crypto
加密 session 內容,或使用 mod_session_dbd
模組將 session 儲存在伺服器上。
標準 Cookie 參數可以在 Cookie 名稱後指定,如下例所示。
Session On SessionCryptoPassphrase secret SessionCookieName session path=/private;domain=example.com;httponly;secure;
在 Apache 伺服器作為後端原始伺服器的前端時,可以使用 SessionCookieRemove
指令從輸入的 HTTP 標頭中移除 session Cookie。這可避免後端伺服器存取 session Cookie 的內容。
如同許多應用程式伺服器有可能一樣,驗證模組可在登入後使用 session 儲存使用者名稱和密碼。 mod_auth_form
會將使用者的登入名稱和密碼儲存在 session 中。
Session On SessionCryptoPassphrase secret SessionCookieName session path=/ AuthFormProvider file AuthUserFile "conf/passwd" AuthType form AuthName "realm" #...
請參閱 mod_auth_form
模組以取得文件和完整的範例。
若要讓 session 能發揮功用,必須容許與外部應用程式分享 session 內容,也必須容許外部應用程式自己寫入 session。
典型的範例可能是變更 mod_auth_form
所設定使用者密碼的應用程式。這個應用程式需要從 session 讀取目前的使用者名稱和密碼,針對使用者的密碼進行必要的變更,然後寫入新的密碼到 session 中,以提供順暢無縫地切換到新的密碼。
第二個範例可能是第一次為新使用者註冊的應用程式。註冊完成後,使用者名稱和密碼會寫入到 session 中,提供順暢無縫地切換到登入狀態。
mod_auth_form
等模組所使用。SessionEnv
指令的設定控制。腳本程式可以透過傳回名稱由SessionHeader
指令設定的application/x-www-form-urlencoded回應標頭來撰寫這段回合。在這兩種情況下,任何加密或解密和從所選儲存機制中讀取或寫入這段回合均由mod_session
模組和相對應的組態來處理。mod_proxy
之後的應用程式SessionHeader
指令用來定義 HTTP 要求標頭,則編碼為application/x-www-form-urlencoded字串的這段回合可供應用程式使用。如果回應中提供了相同的標頭,這個回應標頭的數值會用來取代這段回合。如上所述,任何加密或解密和從所選儲存機制中讀取或寫入這段回合均由mod_session
模組和相對應的組態來處理。說明 | 啟用目前目錄或位置的回合 |
---|---|
語法 | Session On|Off |
預設值 | Session Off |
本文 | 伺服器組態、虛擬主機、目錄、.htaccess |
覆寫 | AuthConfig |
狀態 | 擴充 |
模組 | mod_session |
Session
指令啟用目錄或位置容器的回合。其他指令會控制這段回合儲存在何處以及如何維護隱私。
說明 | 控制是否將這段回合的內容寫入HTTP_SESSION環境變數 |
---|---|
語法 | SessionEnv On|Off |
預設值 | SessionEnv Off |
本文 | 伺服器組態、虛擬主機、目錄、.htaccess |
覆寫 | AuthConfig |
狀態 | 擴充 |
模組 | mod_session |
如果設定為On,SessionEnv
指令會將這段回合的內容寫入稱為HTTP_SESSION的 CGI 環境變數。
字串會以 URL 查詢格式撰寫,例如
key1=foo&key3=bar
說明 | 定義忽略這段回合的 URL 前置詞 |
---|---|
語法 | SessionExclude path |
預設值 | 無 |
本文 | 伺服器組態、虛擬主機、目錄、.htaccess |
狀態 | 擴充 |
模組 | mod_session |
指令 SessionExclude
僅針對 URL 前綴允許停用會話。這可以用於透過鎖定應維持會話的更精確 URL 空間來讓網站效率更好。預設情況下,目錄或位置中的所有 URL 都包含在會話中。指令 SessionExclude
優先於指令 SessionInclude
。
此指令的目的與 HTTP Cookie 中的 path 屬性類似,但應避免將此指令與該屬性混淆。此指令不會設定 path 屬性,該屬性必須另外設定。
說明 | 定義會話逾期時間可能改變而不更新會話的秒數 |
---|---|
語法 | SessionExpiryUpdateInterval interval |
預設值 | SessionExpiryUpdateInterval 0(時時更新) |
本文 | 伺服器組態、虛擬主機、目錄、.htaccess |
狀態 | 擴充 |
模組 | mod_session |
相容性 | 出現在 Apache 2.4.41 及更新版本 |
指令 SessionExpiryUpdateInterval
允許會話避免當只有逾期時間已改變時,與寫入會話在每個要求相關的成本。這可用於讓網站更有效率或降低使用 mod_session_dbd
時的資料庫負載。如果儲存在會話的資料已改變,或逾期時間已改變超過已設定間隔,則會話時時會被寫入。
將間隔設定為零會停用此指令,且在每次要求進行時,會話逾期時間會加以重新整理。
此指令只在結合 SessionMaxAge
以啟用會話逾期時間時才有效果。沒有逾期時間的會話僅在儲存在會話中的資料已改變時才會被寫入。
因為會話逾期時間可能不會在每次要求中重新整理,因此可能會讓會話提早至多 interval 秒就逾期。使用小的間隔,通常會提供足夠的儲蓄,同時對逾期解析產生極小的效果。
說明 | 從某個既定的 HTTP 回應標頭匯入會話更新 |
---|---|
語法 | SessionHeader header |
預設值 | 無 |
本文 | 伺服器組態、虛擬主機、目錄、.htaccess |
覆寫 | AuthConfig |
狀態 | 擴充 |
模組 | mod_session |
指令 SessionHeader
定義一個 HTTP 回應標頭的名稱,此名稱如果存在,就會被解析並寫入目前的會話。
標頭的值預期為 URL 查詢格式,例如
key1=foo&key2=&key3=bar
其中,如果將某個金鑰設定為空字串,表示將從會話中移除該金鑰。