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

Apache 模組 mod_session

語言:  en  |  fr 

說明會話支援
狀態擴充
模組識別session_module
原始檔mod_session.c
相容性在 Apache 2.3 和更新版本中可用

摘要

警告

會話模組使用 HTTP Cookie,因此可能會遭受跨網站指令碼攻擊,或將潛在的私人資訊公開給客戶端。請在為伺服器啟用會話功能前,確保已考慮相關風險。

這個模組提供支援,可透過伺服器建立使用者會話介面。會話可用於追蹤使用者是否已登入,或其他每個使用者的資訊,這些資訊應在各個要求之間保持有效。

會話可以儲存在伺服器或瀏覽器。會話也可以在需要時加密以增加安全性。這些功能分為幾個模組,已新增至 mod_session 中;mod_session_cryptomod_session_cookiemod_session_dbd。根據伺服器需求,將適當的模組載入伺服器(在編譯時靜態載入,或透過 LoadModule 指令動態載入)。

會話可以透過其他依賴會話的模組進行處理,或者可以使用環境變數和 HTTP 標頭讀取和寫入會話,視情況而定。

Support Apache!

主題

指令

Bugfix 清單

參見

top

什麼是階段?

階段介面的核心是一張鍵值對表格,並可以在瀏覽器要求中存取。依據使用階段的應用程式需要,這些對值可以設定為任何有效的字串。

「階段」是一個 application/x-www-form-urlencoded 字串,其中包含這些定義在 HTML 規範 中的鍵值對。

階段在寫入儲存機制之前,可以選擇先進行加密和 base64 編碼,由管理員定義。

top

誰可以使用階段?

階段介面主要是開發給其他伺服器模組使用,例如 mod_auth_form,不過也可以選擇授與基於 CGI 的應用程式存取階段內容,方法是透過 HTTP_SESSION 環境變數。階段可以使用包含新階段參數的 HTTP 回應標頭進行修改及/或更新。

top

在伺服器上保留階段

可以設定 Apache 在特定伺服器或伺服器群組上追蹤每個使用者的階段。此功能類似在一般應用程式伺服器中提供的階段。

如果已設定組態,階段會透過儲存在 cookie 中的階段 ID 追蹤,或從 URL 查詢字串內嵌的參數中擷取,就像一般 GET 要求找到的一樣。

由於階段內容完全儲存在伺服器上,所以預期階段內容具有隱私性。如果出現大量階段,或大量網路伺服器必須彼此分享階段,這會對效能和資源造成影響。

mod_session_dbd 模組允許透過 mod_dbd 將使用階段儲存在 SQL 資料庫中。

top

在瀏覽器上保留階段

在流量大的環境中,在伺服器上追蹤階段會耗費太多資源或不方便,因此改為選擇將階段內容儲存在客戶端瀏覽器的 cookie 內。

這具有優點,也就是在伺服器上追蹤階段所需的資源很小,而伺服器農場內的數個伺服器不需要分享階段資訊。

然而,該會話內容會揭露給用戶端,這伴隨著隱私損失的風險。你可以設定 mod_session_crypto 模組,在將會話寫入用戶端之前先對會話內容進行加密。

mod_session_cookie 允許在 HTTP Cookie 中於瀏覽器上儲存使用者會話。

top

基本範例

若要建立會話,只要開啟會話,並決定會話的儲存位置即可,十分簡單。在此範例中,會話會儲存在瀏覽器上名為 session 的 Cookie 中。

基於瀏覽器的會話

Session On
SessionCookieName session path=/

除非會話可以寫入或讀取,否則會話便派不上用場。以下範例顯示如何透過名為 X-Replace-Session 的預先定義 HTTP 回應標頭,將值注入會話。

寫入會話

Session On
SessionCookieName session path=/
SessionHeader X-Replace-Session

標頭應包含名稱值對,格式與網址中的查詢字串相同,如下面的範例。將金鑰設定為空字串會將金鑰從會話中移除。

撰寫會話的 CGI

#!/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

top

會話隱私

使用瀏覽器的「顯示 Cookie」功能,你可以看到會話的純文字表示。如果最終使用者不需知道會話內容,或是第三方可能會未經授權存取會話中的資料,這可能會造成問題。

在使用 mod_session_crypto 模組將會話置於瀏覽器之前,會話內容可以選擇進行加密。

基於瀏覽器的加密會話

Session On
SessionCryptoPassphrase secret
SessionCookieName session path=/

Apache 會在載入時自動解密會話,並在儲存時加密會話;使用會話的基礎應用程式不需要知道正在進行加密。

儲存在伺服器而非瀏覽器上的會話也可以依需要進行加密,當使用 mod_session_dbd 模組在伺服器農場中之 Web 伺服器間共享潛在敏感資訊時,提供隱私權。

top

Cookie 隱私權

HTTP Cookie 機制也提供隱私權功能,例如將 Cookie 傳輸僅限於受 SSL 保護的網頁,或防止基於瀏覽器的 JavaScript 存取 Cookie 內容。

警告

部分 HTTP Cookie 隱私權功能屬於非標準,或者並未在所有瀏覽器中一致地實作。session 模組可讓您設定 Cookie 參數,但無法保證瀏覽器會尊重隱私權。如果您擔憂安全性,請使用 mod_session_crypto 加密 session 內容,或使用 mod_session_dbd 模組將 session 儲存在伺服器上。

標準 Cookie 參數可以在 Cookie 名稱後指定,如下例所示。

設定 Cookie 參數

Session On
SessionCryptoPassphrase secret
SessionCookieName session path=/private;domain=example.com;httponly;secure;

在 Apache 伺服器作為後端原始伺服器的前端時,可以使用 SessionCookieRemove 指令從輸入的 HTTP 標頭中移除 session Cookie。這可避免後端伺服器存取 session Cookie 的內容。

top

用於驗證的 session 支援

如同許多應用程式伺服器有可能一樣,驗證模組可在登入後使用 session 儲存使用者名稱和密碼。 mod_auth_form 會將使用者的登入名稱和密碼儲存在 session 中。

基於表單的驗證

Session On
SessionCryptoPassphrase secret
SessionCookieName session path=/
AuthFormProvider file
AuthUserFile "conf/passwd"
AuthType form
AuthName "realm"
#...

請參閱 mod_auth_form 模組以取得文件和完整的範例。

top

整合 session 與外部應用程式

若要讓 session 能發揮功用,必須容許與外部應用程式分享 session 內容,也必須容許外部應用程式自己寫入 session。

典型的範例可能是變更 mod_auth_form 所設定使用者密碼的應用程式。這個應用程式需要從 session 讀取目前的使用者名稱和密碼,針對使用者的密碼進行必要的變更,然後寫入新的密碼到 session 中,以提供順暢無縫地切換到新的密碼。

第二個範例可能是第一次為新使用者註冊的應用程式。註冊完成後,使用者名稱和密碼會寫入到 session 中,提供順暢無縫地切換到登入狀態。

Apache 模組
伺服器內需要存取 session 的模組可以使用 mod_session.h API 從 session 讀取和寫入。此機制是 mod_auth_form 等模組所使用。
CGI 程式和腳本語言
在 Web 伺服器中執行的應用程式可以選擇性地從HTTP_SESSION環境變數中擷取這段回合的數值。這段回合應該以application/x-www-form-urlencoded字串編碼,如HTML 規格中所述。這項環境變數可透過SessionEnv指令的設定控制。腳本程式可以透過傳回名稱由SessionHeader指令設定的application/x-www-form-urlencoded回應標頭來撰寫這段回合。在這兩種情況下,任何加密或解密和從所選儲存機制中讀取或寫入這段回合均由mod_session模組和相對應的組態來處理。
mod_proxy之後的應用程式
如果SessionHeader指令用來定義 HTTP 要求標頭,則編碼為application/x-www-form-urlencoded字串的這段回合可供應用程式使用。如果回應中提供了相同的標頭,這個回應標頭的數值會用來取代這段回合。如上所述,任何加密或解密和從所選儲存機制中讀取或寫入這段回合均由mod_session模組和相對應的組態來處理。
獨立的應用程式
應用程式可能會選擇在 Apache HTTP 伺服器的控制之外操作這段回合。在這種情況下,應用程式有責任從所選儲存機制讀取這段回合、解密這段回合、更新這段回合、加密這段回合,以及視情況而定寫入所選儲存機制中的這段回合。
top

Session 指令

說明啟用目前目錄或位置的回合
語法Session On|Off
預設值Session Off
本文伺服器組態、虛擬主機、目錄、.htaccess
覆寫AuthConfig
狀態擴充
模組mod_session

Session指令啟用目錄或位置容器的回合。其他指令會控制這段回合儲存在何處以及如何維護隱私。

top

SessionEnv 指令

說明控制是否將這段回合的內容寫入HTTP_SESSION環境變數
語法SessionEnv On|Off
預設值SessionEnv Off
本文伺服器組態、虛擬主機、目錄、.htaccess
覆寫AuthConfig
狀態擴充
模組mod_session

如果設定為OnSessionEnv指令會將這段回合的內容寫入稱為HTTP_SESSION的 CGI 環境變數。

字串會以 URL 查詢格式撰寫,例如

key1=foo&key3=bar

top

SessionExclude 指令

說明定義忽略這段回合的 URL 前置詞
語法SessionExclude path
預設值
本文伺服器組態、虛擬主機、目錄、.htaccess
狀態擴充
模組mod_session

指令 SessionExclude 僅針對 URL 前綴允許停用會話。這可以用於透過鎖定應維持會話的更精確 URL 空間來讓網站效率更好。預設情況下,目錄或位置中的所有 URL 都包含在會話中。指令 SessionExclude 優先於指令 SessionInclude

警告

此指令的目的與 HTTP Cookie 中的 path 屬性類似,但應避免將此指令與該屬性混淆。此指令不會設定 path 屬性,該屬性必須另外設定。

top

SessionExpiryUpdateInterval 指令

說明定義會話逾期時間可能改變而不更新會話的秒數
語法SessionExpiryUpdateInterval interval
預設值SessionExpiryUpdateInterval 0(時時更新)
本文伺服器組態、虛擬主機、目錄、.htaccess
狀態擴充
模組mod_session
相容性出現在 Apache 2.4.41 及更新版本

指令 SessionExpiryUpdateInterval 允許會話避免當只有逾期時間已改變時,與寫入會話在每個要求相關的成本。這可用於讓網站更有效率或降低使用 mod_session_dbd 時的資料庫負載。如果儲存在會話的資料已改變,或逾期時間已改變超過已設定間隔,則會話時時會被寫入。

將間隔設定為零會停用此指令,且在每次要求進行時,會話逾期時間會加以重新整理。

此指令只在結合 SessionMaxAge 以啟用會話逾期時間時才有效果。沒有逾期時間的會話僅在儲存在會話中的資料已改變時才會被寫入。

警告

因為會話逾期時間可能不會在每次要求中重新整理,因此可能會讓會話提早至多 interval 秒就逾期。使用小的間隔,通常會提供足夠的儲蓄,同時對逾期解析產生極小的效果。

top

SessionHeader 指令

說明從某個既定的 HTTP 回應標頭匯入會話更新
語法SessionHeader header
預設值
本文伺服器組態、虛擬主機、目錄、.htaccess
覆寫AuthConfig
狀態擴充
模組mod_session

指令 SessionHeader 定義一個 HTTP 回應標頭的名稱,此名稱如果存在,就會被解析並寫入目前的會話。

標頭的值預期為 URL 查詢格式,例如

key1=foo&key2=&key3=bar

其中,如果將某個金鑰設定為空字串,表示將從會話中移除該金鑰。

top

SessionInclude 指令

說明定義會話有效的 URL 前綴
語法SessionInclude path
預設值所有 URL
本文伺服器組態、虛擬主機、目錄、.htaccess
覆寫AuthConfig
狀態擴充
模組mod_session

SessionInclude 指令容許只對特定 URL 字首生效的階段。這可以用於針對維持階段更精確的 URL 空間,讓網站更有效率。預設情況下,目錄或位置中的所有 URL 都會包含在階段內。

警告

此指令的目的與 HTTP Cookie 中的 path 屬性類似,但應避免將此指令與該屬性混淆。此指令不會設定 path 屬性,該屬性必須另外設定。

top

SessionMaxAge 指令

說明定義階段的最大存活時間(秒為單位)
語法SessionMaxAge 最大存活時間
預設值SessionMaxAge 0
本文伺服器組態、虛擬主機、目錄、.htaccess
覆寫AuthConfig
狀態擴充
模組mod_session

SessionMaxAge 指令定義了階段將保持有效的時間限制。當儲存階段時,此時間限制會重設,現有的階段可以繼續。如果階段在未要求伺服器重新整理階段的情況下變得比此限制還舊,階段將逾時並被移除。當階段用於儲存使用者登入詳細資料時,這會在指定時間後自動將使用者登出。

將最大存活時間設定為零會停用階段逾期功能。

語言:  en  |  fr 

top

註解

注意事項
此處並非問答區。張貼於此的留言必須是針對改善文件或伺服器的建議,若已被實作或被視為無效/無關主題,管理員可能會將其移除。有關如何管理 Apache HTTP 伺服器的問題應轉向 Libera.chat 上的 IRC 頻道 #httpd,或傳送至我們的郵件清單