PHP Conference Japan 2024

執行期配置

這些函式的行為會受到 php.ini 中的設定影響。

Session 配置選項
名稱 預設值 可變更 變更日誌
session.save_path "" INI_ALL  
session.name "PHPSESSID" INI_ALL  
session.save_handler "files" INI_ALL  
session.auto_start "0" INI_PERDIR  
session.gc_probability "1" INI_ALL  
session.gc_divisor "100" INI_ALL  
session.gc_maxlifetime "1440" INI_ALL  
session.serialize_handler "php" INI_ALL  
session.cookie_lifetime "0" INI_ALL  
session.cookie_path "/" INI_ALL  
session.cookie_domain "" INI_ALL  
session.cookie_secure "0" INI_ALL 在 PHP 7.2.0 之前,預設值為 ""
session.cookie_httponly "0" INI_ALL 在 PHP 7.2.0 之前,預設值為 ""
session.cookie_samesite "" INI_ALL 在 PHP 7.3.0 中可用。
session.use_strict_mode "0" INI_ALL  
session.use_cookies "1" INI_ALL  
session.use_only_cookies "1" INI_ALL  
session.referer_check "" INI_ALL  
session.cache_limiter "nocache" INI_ALL  
session.cache_expire "180" INI_ALL  
session.use_trans_sid "0" INI_ALL  
session.trans_sid_tags "a=href,area=href,frame=src,form=" INI_ALL 在 PHP 7.1.0 中可用。
session.trans_sid_hosts $_SERVER['HTTP_HOST'] INI_ALL 在 PHP 7.1.0 中可用。
session.sid_length "32" INI_ALL 在 PHP 7.1.0 中可用。在 PHP 8.4.0 中已棄用。
session.sid_bits_per_character "4" INI_ALL 在 PHP 7.1.0 中可用。在 PHP 8.4.0 中已棄用。
session.upload_progress.enabled "1" INI_PERDIR  
session.upload_progress.cleanup "1" INI_PERDIR  
session.upload_progress.prefix "upload_progress_" INI_PERDIR  
session.upload_progress.name "PHP_SESSION_UPLOAD_PROGRESS" INI_PERDIR  
session.upload_progress.freq "1%" INI_PERDIR  
session.upload_progress.min_freq "1" INI_PERDIR  
session.lazy_write "1" INI_ALL  
session.hash_function "0" INI_ALL 在 PHP 7.1.0 中移除。
session.hash_bits_per_character "4" INI_ALL 在 PHP 7.1.0 中移除。
session.entropy_file "" INI_ALL 在 PHP 7.1.0 中移除。
session.entropy_length "0" INI_ALL 在 PHP 7.1.0 中移除
關於 INI_* 模式的詳細資訊和定義,請參閱設定設定可能的位置

session 管理系統支援許多配置選項,您可以將這些選項放置在您的 php.ini 檔案中。 我們將給出一個簡短的概述。

session.save_handler 字串
session.save_handler 定義用於儲存和檢索與 session 相關聯的資料的處理程式名稱。預設為 files。請注意,個別擴展可能會註冊它們自己的 save_handler;可以通過參考 phpinfo() 來取得每個安裝的已註冊處理程式。另請參閱 session_set_save_handler()
session.save_path 字串
session.save_path 定義傳遞給儲存處理程式的參數。如果您選擇預設的檔案處理程式,這是建立檔案的路徑。另請參閱 session_save_path()

此指令有一個可選的 N 參數,它決定您的 session 檔案將分散在多少個目錄層級中。 例如,設定為 '5;/tmp' 可能最終會建立一個類似 /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If 的 session 檔案和位置。 為了使用 N,您必須在使用之前建立所有這些目錄。ext/session 中存在一個小的 shell 腳本來執行此操作,它被稱為 mod_files.sh,以及一個名為 mod_files.bat 的 Windows 版本。 另請注意,如果使用 N 且大於 0,則不會執行自動垃圾回收,有關詳細資訊,請參閱 php.ini 的副本。 此外,如果您使用 N,請務必將 session.save_path 用「引號」括起來,因為分隔符號 (;) 也用於 php.ini 中的註解。

檔案儲存模組預設使用模式 600 建立檔案。可以使用可選的 MODE 參數變更此預設值:N;MODE;/path,其中 MODE 是模式的八進制表示形式。設定 MODE 不會影響程序的 umask。

警告

如果此設定為世界可讀的目錄,例如 /tmp(預設值),則伺服器上的其他使用者可能會透過取得該目錄中的檔案清單來劫持 session。

注意

當使用可選的目錄層級參數 N(如上所述)時,請注意,由於需要大量的目錄,對於大多數網站來說,使用大於 1 或 2 的值是不合適的:例如,值 3 表示檔案系統上存在 (2 ** session.sid_bits_per_character) ** 3 個目錄,這可能會導致大量浪費的空間和 inode。

僅當您絕對確定您的網站大到需要時,才使用大於 2 的 N

session.name 字串
session.name 指定用作 cookie 名稱的 session 名稱。 它應該只包含字母數字字元。 預設為 PHPSESSID。另請參閱 session_name()
session.auto_start 布林值
session.auto_start 指定 session 模組是否在請求啟動時自動啟動 session。 預設為 0(停用)。
session.serialize_handler 字串
session.serialize_handler 定義用於序列化/反序列化資料的處理程式名稱。 支援 PHP 序列化格式(名稱 php_serialize)、PHP 內部格式(名稱 phpphp_binary)和 WDDX(名稱 wddx)。 只有在 PHP 編譯時啟用WDDX 支援,WDDX 才可用。 php_serialize 在內部使用普通的 serialize/unserialize 函式,並且沒有 phpphp_binary 所具有的限制。 較舊的序列化處理程式無法在 $_SESSION 中儲存數值索引,也不能儲存包含特殊字元(|!)的字串索引。 使用 php_serialize 以避免在腳本關閉時發生數值索引或特殊字元錯誤。 預設為 php
session.gc_probability 整數
session.gc_probabilitysession.gc_divisor 結合使用來管理啟動 gc (garbage collection) 常式的機率。 預設為 1。 必須大於或等於 0。 有關詳細資訊,請參閱 session.gc_divisor
session.gc_divisor 整數
session.gc_divisorsession.gc_probability 結合定義了每次 session 初始化時啟動 gc(垃圾回收)程序的機率。 該機率是透過使用 gc_probability/gc_divisor 計算得出的,例如 1/100 表示每次請求啟動 GC 程序的機率為 1%。 session.gc_divisor 預設為 100。 必須大於 0
session.gc_maxlifetime 整數
session.gc_maxlifetime 指定資料在被視為「垃圾」並可能被清除之前的秒數。 垃圾回收可能會在 session 開始時發生(取決於 session.gc_probabilitysession.gc_divisor)。 預設為 1440(24 分鐘)。

注意如果不同的腳本具有不同的 session.gc_maxlifetime 值,但共享相同的 session 資料儲存位置,則最小值的腳本將會清除資料。 在這種情況下,請將此指令與 session.save_path 一起使用。

session.referer_check 字串
session.referer_check 包含您要檢查每個 HTTP Referer 的子字串。 如果 Referer 是由用戶端發送的,並且未找到該子字串,則嵌入的 session ID 將被標記為無效。 預設為空字串。
session.entropy_file 字串
session.entropy_file 提供一個外部資源(檔案)的路徑,該檔案將在會話 ID 建立過程中作為額外的熵來源。例如,在許多 Unix 系統上可用的 /dev/random/dev/urandom Windows 系統也支援此功能。將 session.entropy_length 設定為非零值將使 PHP 使用 Windows Random API 作為熵來源。

注意 在 PHP 7.1.0 中已移除。 如果 /dev/urandom/dev/arandom 可用,則 session.entropy_file 預設為 /dev/urandom/dev/arandom

session.entropy_length int
session.entropy_length 指定將從上述檔案讀取的位元組數。預設值為 32 在 PHP 7.1.0 中已移除。
session.use_strict_mode bool
session.use_strict_mode 指定模組是否使用嚴格會話 ID 模式。如果啟用此模式,模組將不接受未初始化的會話 ID。如果瀏覽器傳送未初始化的會話 ID,則會將新的會話 ID 發送到瀏覽器。應用程式透過嚴格模式下的會話採用來防止會話固定攻擊。預設值為 0(停用)。

注意 啟用 session.use_strict_mode 對於一般會話安全性是強制性的。建議所有網站都啟用此功能。有關詳細資訊,請參閱 session_create_id() 的範例程式碼。

警告

如果透過 session_set_save_handler() 註冊的自訂會話處理器未實作 SessionUpdateTimestampHandlerInterface::validateId(),或未提供 validate_sid 回呼函式,則無論此指令的值為何,嚴格會話 ID 模式都將被有效地停用。特別注意 SessionHandler實作 SessionHandler::validateId()

session.use_cookies bool
session.use_cookies 指定模組是否使用 Cookie 在用戶端儲存會話 ID。預設值為 1(啟用)。
session.use_only_cookies bool
session.use_only_cookies 指定模組是否使用 Cookie 在用戶端儲存會話 ID。啟用此設定可防止在 URL 中傳遞會話 ID 的攻擊。預設值為 1(啟用)。
session.cookie_lifetime int
session.cookie_lifetime 指定傳送到瀏覽器的 Cookie 的生命週期(以秒為單位)。值 0 表示「直到瀏覽器關閉」。預設值為 0。另請參閱 session_get_cookie_params()session_set_cookie_params()

注意 過期時間戳記是相對於伺服器時間設定的,而伺服器時間不一定與用戶端瀏覽器中的時間相同。

session.cookie_path string
session.cookie_path 指定會話 Cookie 中要設定的路徑。預設值為 /。另請參閱 session_get_cookie_params()session_set_cookie_params()
session.cookie_domain string
session.cookie_domain 指定會話 Cookie 中要設定的網域。預設值為無,表示根據 Cookie 規範產生 Cookie 的伺服器主機名稱。另請參閱 session_get_cookie_params()session_set_cookie_params()
session.cookie_secure bool
session.cookie_secure 指定是否僅應通過安全連線傳送 Cookie。將此選項設定為 on 時,會話僅適用於 HTTPS 連線。如果設定為 off,則會話適用於 HTTP 和 HTTPS 連線。預設值為 off。另請參閱 session_get_cookie_params()session_set_cookie_params()
session.cookie_httponly bool
將 Cookie 標記為僅可透過 HTTP 協定存取。這表示 Cookie 將無法被腳本語言(例如 JavaScript)存取。此設定可以有效地幫助減少透過 XSS 攻擊造成的身份竊盜(儘管並非所有瀏覽器都支援)。
session.cookie_samesite string
允許伺服器宣告 Cookie 不應與跨站請求一起傳送。此宣告允許使用者代理程式降低跨域資訊洩漏的風險,並提供一些針對跨站請求偽造攻擊的保護。請注意,並非所有瀏覽器都支援此功能。空值表示不會設定 SameSite Cookie 屬性。LaxStrict 表示 Cookie 不會針對 POST 請求跨域傳送;Lax 會針對跨域 GET 請求傳送 Cookie,而 Strict 則不會。
session.cache_limiter string
session.cache_limiter 指定用於會話頁面的快取控制方法。它可能是以下值之一:nocacheprivateprivate_no_expirepublic。預設值為 nocache。另請參閱 session_cache_limiter() 文件,以了解這些值的含義。
session.cache_expire int
session.cache_expire 指定快取會話頁面的存留時間(以分鐘為單位),這對 nocache 限制器無效。預設值為 180。另請參閱 session_cache_expire()
session.use_trans_sid bool
session.use_trans_sid 是否啟用透明 sid 支援。預設值為 0(停用)。

注意 與基於 Cookie 的會話管理相比,基於 URL 的會話管理具有額外的安全風險。例如,使用者可能會透過電子郵件將包含活動會話 ID 的 URL 發送給朋友,或者使用者可能會將包含會話 ID 的 URL 保存到書籤中,並始終使用相同的會話 ID 存取您的網站。 自 PHP 7.1.0 起,完整 URL 路徑(例如 https://php.dev.org.tw/)由透明 sid 功能處理。先前的 PHP 僅處理相對 URL 路徑。重寫目標主機由 session.trans_sid_hosts 定義。

session.trans_sid_tags string
session.trans_sid_tags 指定啟用透明 sid 支援時,會重寫哪些 HTML 標籤以包含會話 ID。預設值為 a=href,area=href,frame=src,input=src,form= form 是一個特殊標籤。<input hidden="session_id" name="session_name"> 作為表單變數加入。

注意 在 PHP 7.1.0 之前,url_rewriter.tags 用於此目的。自 PHP 7.1.0 起,fieldset 不再被視為特殊標籤。

session.trans_sid_hosts string
session.trans_sid_hosts 指定啟用透明 sid 支援時,會重寫哪些主機以包含會話 ID。預設值為 $_SERVER['HTTP_HOST']。可以透過「,」指定多個主機,主機之間不允許有空格。例如,php.net,wiki.php.net,bugs.php.net
session.sid_length int
session.sid_length 允許您指定會話 ID 字串的長度。會話 ID 長度可以在 22 到 256 之間。 預設值為 32。如果您需要相容性,可以指定 32、40 等。較長的會話 ID 更難以猜測。建議至少使用 32 個字元。
提示

相容性注意事項:使用 32 而不是 session.hash_function=0 (MD5) 和 session.hash_bits_per_character=4,session.hash_function=1 (SHA1) 和 session.hash_bits_per_character=6。使用 26 而不是 session.hash_function=0 (MD5) 和 session.hash_bits_per_character=5。使用 22 而不是 session.hash_function=0 (MD5) 和 session.hash_bits_per_character=6。您必須配置 INI 值以使會話 ID 中至少有 128 個位元。不要忘記為 session.sid_bits_per_character 設定適當的值,否則您將擁有較弱的會話 ID。

注意 此設定是在 PHP 7.1.0 中引入的。

session.sid_bits_per_character int
session.sid_bits_per_character 允許您指定編碼會話 ID 字元中的位元數。可能的值為 '4' (0-9, a-f)、'5' (0-9, a-v) 和 '6' (0-9, a-z, A-Z, "-", ",")。 預設值為 4。位元數越多,會話 ID 就越強。建議大多數環境使用值 5。

注意 此設定是在 PHP 7.1.0 中引入的。

session.hash_function mixed
session.hash_function 允許您指定用於產生會話 ID 的雜湊演算法。'0' 表示 MD5 (128 位元),'1' 表示 SHA-1 (160 位元)。

也可以指定 hash 擴充功能 (如果有的話) 提供的任何演算法,例如 sha512whirlpool。可以使用 hash_algos() 函數取得完整支援的演算法列表。

注意: 已在 PHP 7.1.0 中移除。

session.hash_bits_per_character int
session.hash_bits_per_character 允許您定義在將二進位雜湊資料轉換為可讀取的格式時,每個字元中儲存多少位元。可能的值為 '4' (0-9, a-f)、'5' (0-9, a-v) 和 '6' (0-9, a-z, A-Z, "-", ",")。

注意: 已在 PHP 7.1.0 中移除。

session.upload_progress.enabled bool
啟用上傳進度追蹤,將資料填入 $_SESSION 變數。預設值為 1,已啟用。
session.upload_progress.cleanup bool
在讀取所有 POST 資料後 (即上傳完成) 立即清除進度資訊。預設值為 1,已啟用。

注意: 強烈建議保持此功能啟用。

session.upload_progress.prefix string
用於 $_SESSION 中上傳進度鍵的前綴。此鍵將與 $_POST[ini_get("session.upload_progress.name")] 的值串連,以提供唯一索引。 預設值為 "upload_progress_"。
session.upload_progress.name string
要在 $_SESSION 中儲存進度資訊時使用的鍵名稱。另請參閱 session.upload_progress.prefix 如果未傳遞或無法使用 $_POST[ini_get("session.upload_progress.name")],則不會記錄上傳進度。 預設值為 "PHP_SESSION_UPLOAD_PROGRESS"。
session.upload_progress.freq mixed
定義應多久更新一次上傳進度資訊。可以使用位元組定義 (例如「每 100 位元組更新一次進度資訊」),或使用百分比定義 (例如「收到整個檔案大小的 1% 後更新進度資訊」)。 預設值為 "1%"。
session.upload_progress.min_freq int
更新之間的最小延遲時間,以秒為單位。預設值為 "1" (一秒)。
session.lazy_write bool
session.lazy_write 設定為 1 時,表示只有在會期資料變更時才會重新寫入。預設值為 1,已啟用。

除非啟用 session.upload_progress.enabled 並且設定了 $_POST[ini_get("session.upload_progress.name")] 變數,否則不會註冊上傳進度。有關此功能的詳細資訊,請參閱 會期上傳進度

新增註解

使用者貢獻的註解 21 則註解

35
Walerian Walawski - https://w87.eu/
1 年前
找不到 mod_files.sh?它在這裡
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

#!/usr/bin/env bash

if [[ "$2" = "" ]] || [[ "$3" = "" ]]; then
echo "用法: $0 BASE_DIRECTORY DEPTH BITS_PER_CHAR"
echo "如果 BASE_DIRECTORY 不存在,將會建立它"
echo "DEPTH 必須是 >0 的整數"
echo "BITS_PER_CHAR(session.sid_bits_per_character) 應該是 4、5 或 6 其中之一。"
# https://php.dev.org.tw/manual/en/session.configuration.php#ini.session.sid-bits-per-character
exit 1
fi

if [[ "$2" = "0" ]] && [[ ! "$4" = "recurse" ]]; then
echo "無法建立深度為 0 的目錄樹,正在退出。"
fi

if [[ "$2" = "0" ]]; then
exit 0
fi

directory="$1"
depth="$2"
bitsperchar="$3"

hash_chars="0 1 2 3 4 5 6 7 8 9 a b c d e f"

if [[ "$bitsperchar" -ge "5" ]]; then
hash_chars="$hash_chars g h i j k l m n o p q r s t u v"
fi

if [[ "$bitsperchar" -ge "6" ]]; then
hash_chars="$hash_chars w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z - ,"
fi

while [[ -d $directory ]] && [[ $( ls $directory ) ]]; do
echo "目錄 $directory 不是空的!您想要做什麼?"

options="\"刪除目錄內容\" \"選擇另一個目錄\" \"退出\""
eval set $options
select opt in "$@"; do

if [[ $opt = "刪除目錄內容" ]]; then
echo "正在刪除 $directory 內容... "
rm -rf $directory/*
elif [[ $opt = "選擇另一個目錄" ]]; then
echo "您想要選擇哪個目錄?"
read directory
elif [[ $opt = "退出" ]]; then
exit 0
fi

break;
done
done

if [[ ! -d $directory ]]; then
mkdir -p $directory
fi

echo "正在 $directory 中建立會期路徑,深度為 $depth,用於 session.sid_bits_per_character = $bitsperchar"

for i in $hash_chars; do
newpath="$directory/$i"
mkdir $newpath || exit 1
bash $0 $newpath `expr $depth - 1` $bitsperchar recurse
done
76
Christopher Kramer
10 年前
在基於 Debian 的系統上,在執行階段變更 session.gc_maxlifetime 沒有實際效果。Debian 透過設定 session.gc_probability=0 來停用 PHP 自己的垃圾收集器。相反,它有一個每 30 分鐘執行一次的 cronjob (請參閱 /etc/cron.d/php5),會清除舊的會期。此 cronjob 基本上會查看您的 php.ini,並使用那裡的 session.gc_maxlifetime 值來決定要清除哪些會期 (請參閱 /usr/lib/php5/maxlifetime)。

您可以調整 php.ini 中的全域值 (通常為 /etc/php5/apache2/php.ini)。或者,您可以變更 session.save_path,這樣 Debian 的 cronjob 就不會再清除您的會期。然後,您需要使用您自己的 cronjob 執行自己的垃圾收集,或啟用 PHP 的垃圾收集 (然後 php 需要在 save_path 上有足夠的權限)。

為什麼 Debian 不使用 PHP 的垃圾收集器?
為了安全性考量,它們會將會期資料儲存在具有非常嚴格權限的位置 (/var/lib/php5)。在設定 sticky bit 的情況下,只有 root 允許重新命名或刪除那裡的文件,因此 PHP 本身無法清除舊的會期資料。請參閱 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=267720
2
zch1
11 個月前
當 pwd 包含特殊字元時,應該進行 urlencode。
例如

save_handler:redis
save_path: tcp://127.0.0.1:6739?auth=urlencode('xxxxx')
18
GreenReaper
10 年前
我們發現 session.save_path 深度為 3 會導致 inode 過度浪費,實際上也會浪費磁碟空間來儲存目錄樹。無論如何,ext2/3/4 上的 dir_indexes 選項使較大的目錄更可行,因此我們決定改為使用深度 2。

花了一些時間才弄清楚如何將現有的 PHP 會期向上移動一個目錄樹,但我們最終在根會期目錄中執行了此操作

#!/bin/sh
for a in ./* ; do
cd ./$a
pwd
for b in ./* ; do
cd ./$b
pwd
# 將現有的會期移出
find ./* -xdev -type f -print0 | xargs -0 mv -t .
# 移除子目錄
find ./* -xdev -type d -print0 | xargs -0 rmdir
cd ..
done
cd ..
done

此腳本可能不是最好的方法,但它很快就完成了工作。您可以透過新增或移除 "for" 迴圈來修改它以用於不同的深度。

文件將深度 5 作為範例,但 5 絕對不適合。如果您要超過 2,則您的規模可能需要考慮改用大型 memcached 或 redis 實例。
15
info at thimbleopensource dot com
9 年前
我發現如果您需要設定自訂的會期設定,您只需要在會期開始時執行一次即可。然後,會期會維持其設定,即使您使用 ini_set 並變更它們,原始會期仍會使用其原始設定,直到過期。

只是認為它可能對某些人有用。
9
Wouter
14 年前
在 .htaccess 中設定 session.cookie_lifetime 指示時,請使用字串格式,例如;

php_value session.cookie_lifetime "123456"

而不是

php_value session.cookie_lifetime 123456

如上所述使用整數在我的情況下無效 (Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.5 with Suhosin-Patch mod_ssl/2.2.11 OpenSSL/0.9.8g)
8
jlevene at etisoftware dot com
11 年前
由於找不到 mod_files.sh 的實際副本,並且看到很多對它的抱怨/錯誤修復請求,這是一個可行的版本。它從 PHP.INI 取得所有參數,因此您沒有機會弄亂它

#!/bin/bash
#
# 為 PHP 會期儲存建立目錄。
# 取代「PHP 自帶」的版本,該版本 (a) 並非總是自帶
# 且 (b) 效果不佳。
#
# 此版本不接受任何參數,並使用 PHP.INI 中的值 (如果
# 它可以找到的話)。
#
# 適用於 OS-X 和 CentOS (以及所有其他) Linux。
#
# Jeff Levene 於 2013 年 2 月撰寫。

[[ $# -gt 0 ]] && echo "$0 不需要命令列參數。
它會執行 PHP.INI 檔案中所要求的所有動作 (如果可以找到的話)。
" && exit 1

# 盡可能尋找 PHP.INI 檔案
phpIni=/usr/local/lib/php.ini # 預設 PHP.INI 位置
[[ ! -f "$phpIni" ]] && phpIni=/etc/php.ini # 次要位置
[[ ! -f "$phpIni" ]] && phpIni= # 找到了嗎?

# 從 PHP.INI 檔案輸出給定的 (作為 $1) 參數
# 「空」括號中包含一個空格和一個 Tab。
#
PhpConfigParam() {
[[ ! "$phpIni" ]] && return
# 從 INI 檔案取得行
varLine=`grep "^[ ]*$1[ ]*=" "$phpIni"`

# 擷取值
value=`expr "$varLine" : ".*$1[ ]*=[ ]*['\"]*\([^'\"]*\)"`
echo "$value"
}

if [[ "$phpIni" ]]
then
savePath=`PhpConfigParam session.save_path`
# 如果前面有一個數字和分號,請移除它們
dirDepth=`expr "$savePath" : '\([0-9]*\)'`
[[ "$dirDepth" ]] && savePath=`expr "$savePath" : '[0-9]*;\(.*\)'` || dirDepth=0
bits=`PhpConfigParam session.hash_bits_per_character`
case "x$bits" in
x) echo "未定義 hash_bits_per_character。不執行。" ; exit 2 ;;
x4) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f' ;;
x5) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v' ;;
x6) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v'
alphabet="$alphabet w x y z A B C D E F G H I J K L M N O P Q R S T U V W"
alphabet="$alphabet X Y Z - ,"
;;
*) echo "無法辨識 hash_bits_per_character。不執行。" ; exit 2 ;;
esac
else
echo "找不到 PHP.INI 檔案。不執行。抱歉。"
exit 2
fi

# 要建立的目錄深度為 $1。0 表示只建立指定的
# 目錄。起始目錄為 $2。
#
# 遞迴使用,所以變數必須為「local」。

doDir() {
local dir="$2"
if [[ -d "$dir" ]]
then
echo "目錄 '$dir' 已存在。沒有問題。"
elif [[ -f "$dir" ]]
then
echo "檔案 '$dir' 已存在。中止。" ; exit 2
else
if mkdir "$dir"
then
echo "目錄 '$dir' 已建立。"
else
echo "無法建立目錄 '$dir'。中止。" ; exit 2
fi
fi
chmod a+rwx "$dir"
if [[ $1 -gt 0 ]]
then
local depth=$(( $1 - 1 ))
for letter in $alphabet
do doDir $depth "$dir/$letter"
done
fi
}


echo "執行時使用 savePath='$savePath', dirDepth=$dirDepth, 以及 bitsPerCharacter=$bits。"
sleep 3

doDir $dirDepth "$savePath"

exit 0
6
hassankhodadadeh at NOSPAM dot gmail dot com
12 年前
"session.gc_maxlifetime" 的最大值為 65535。大於此值可能會導致 php session 停止運作。
2
boan dot web at outlook dot com
5 年前
session.cache_limiter 可以是空字串,以完全停用快取標頭。

引述
> 將快取限制器設定為 '' 將完全關閉自動傳送快取標頭的功能。

https://php.dev.org.tw/manual/en/function.session-cache-limiter.php
2
li-lingjie
6 年前
使用 SessionHandlerInterface 介面自訂 redis session,發現以下問題

使用 ini_set('session.save_path', "tcp://127.0.0.1:6379?auth=password"); 將會回報

PHP 嚴重錯誤:session_start():無法初始化儲存模組:user (路徑:tcp://127.0.0.1:6379?auth=password);

使用 session_save_path("tcp://127.0.0.1:6379?auth=password") 則不會
2
theking2(at)king.ma
9 個月前
將 'sid_bits_per_character' 設定為 6 時,請小心 'sid_length'。

將 sid_bits_per_character 設定為 6 會將逗號 "," 加入至可能字元的清單中。逗號會被逸出並以 "%2C" 傳輸(在 Chromium 版本 119.0.6045.199 上測試),每個逗號會為 SESSION_ID 增加兩個額外字元。
0
theking2(at)king.ma
9 個月前
為了防止中間人攻擊,您需要確保 session cookie 僅透過安全通道傳輸,並在其前面加上魔術字串 "__Secure-"。[1]

像是
<?php
session_start
( [ 'name' => '__Secure-Session-ID' ] );
?>

Cookie 將無法在不安全的通道上使用。

(在這裡加入這個註解可能因為太多的雜訊而被忽略)

[1]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes
2
Nicholas
14 年前
暫時性 session 在 5.3.3 中似乎無法運作

例如:

<?php
ini_set
("session.use_cookies", 0);
ini_set("session.use_trans_sid", 1);
session_start();

if (isset(
$_SESSION["foo"])) {
echo
"Foo: " . $_SESSION["foo"];
} else {
$_SESSION["foo"] = "Bar";
echo
"<a href=?" . session_name() . "=" . session_id() . ">開始測試</a>";
}
?>

這在 5.2.5 中可以運作,但在 5.3.3 中則否
-1
ohcc at 163 dot com
7 年前
當虛擬主機共用相同的 session 儲存目錄時,您應該更加小心地設定 session.gc_maxlifetime。當另一個主機執行 php 時,一個主機的 session 資料可能會被 gc 掉。
-2
AskApache
14 年前
這是我設定 session.save_path 的方式
session.save_path = "1;/home/askapache/tmp/s"
因此,若您想建立資料夾結構,可以使用這個相容的 shell script,若要建立 777 權限,請將 umask 變更為 0000;
sh -o braceexpand -c "umask 0077;mkdir -p s/{0..9}/{a..z} s/{a..z}/{0..9}"

然後您可以建立一個 cronjob 來清理 session 資料夾,方法是將此加入您的 crontab,這會刪除任何超過一小時的 session 檔案
@daily find /home/askapache/tmp/s -type f -mmin +60 -exec rm -f {} \; &>/dev/null

這將在資料夾中建立 session,例如
/home/askapache/tmp/s/b/sess_b1aba5q6io4lv01bpc6t52h0ift227j6

我不認為任何非大型網站需要超過 1 層的深度。否則,您會建立太多目錄,反而會降低由此獲得的效能。
-2
00 at f00n dot com
16 年前
在垃圾收集未清除我的 session 後,我透過以下方法解決了許多問題。

首先,我在 php.ini 中找到這個(因為我使用 phpinfo(); 查看我的主機 ini,所以我沒有注意到)。

; 注意:如果您使用子目錄選項來儲存 session 檔案
;(請參閱上面的 session.save_path),則垃圾收集*不會*
; 自動發生。您需要透過 shell script、cron 項目或其他方法進行自己的垃圾

; 收集。;例如,以下 script 將與
; 將 session.gc_maxlifetime 設定為 1440(1440 秒 = 24 分鐘)等效
; cd /path/to/sessions; find -cmin +24 | xargs rm

考慮到這一點,還有一些選項。

1. 不要使用自訂的 save_path。
** 這表示如果您的 ISP 沒有將您的 session 暫存預設為比安裝預設更安全的東西,或者您正在使用共享目錄來儲存 session 資料,那麼您最好使用具名的 session,以防止您的 session 在其他人的 script 中被檢視。 為此建立 unique_id 名稱是常見的方法。 **

2. 使用您的自訂資料夾,但撰寫垃圾收集 script。

3. 使用自訂處理程式和資料庫
-2
mikaelkael at php dot net
15 年前
最近,我需要在 Windows 下的程式中變更 session save_path。 使用 ini_set('session.save_path', '../data/sessions');(以及 session.gc_divisor = 1 來進行測試),我總是會得到「錯誤 #8 session_start():ps_files_cleanup_dir:opendir(../data/sessions) 失敗:結果太大」。

我透過將其變更為 ini_set('session.save_path', realpath('../data/sessions')); 來修正此問題
-3
orbill
14 年前
顯然 session.use_only_cookies 的預設值在 5.3.3 中已從 0 變更為 1。如果您未在 php.ini 或您的程式碼中將其設定為 0,透明 session 將無法運作。
-4
white-gandalf at web dot de
6 年前
session.use_strict_mode 對於加強您的安全性幾乎沒有作用:只有一種非常特定的攻擊變體可以透過此方法減輕(攻擊者將「空的」sid 交給受害者,以便稍後讓自己的瀏覽器適應該 session) - 例如,他預先開啟 session,將該 session 的 sid 交給受害者,以便受害者適應預先開啟的 session 的情況。 在後一種情況下,此旗標無濟於事。 在其他 session id 洩漏的其他漏洞的所有其他情境中,該旗標也無濟於事。

但是,此旗標會使 php 函數 session_id() 在其參數化變體中失效,從而阻止任何基於此函數的 php 功能。
-1
descartavel1+php at gmail dot com
1 年前
您應該設定 `session.name` 以使用前綴 `__Host-` 或 `__Secure-`。 請參閱 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes
-4
polygon dot co dot in at gmail dot com
3 年前
在 php.ini 中,session.save_handler 定義用於儲存和擷取與 session 相關聯的資料的處理程式名稱。[預設為 files。]

依預設,session.save_handler 支援以下內容

session.save_handler = files
session.save_handler = sqlite
session.save_handler = redis
session.save_handler = memcached

這些會依預設針對使用 session 的任何 HTTP 請求鎖定 session。
鎖定表示,使用者在目前的請求完成之前無法存取與 session 相關的頁面。

因此,如果您認為切換到這些會提高效能;答案是「否!」 因為鎖定行為。

若要覆寫/自訂 Session 鎖定行為,請使用如下方式。

session.save_handler = user
這適用於所有(包含以上列出)的 Session 儲存模式。

對於 "user" 類型的 save_handler,我們可以忽略鎖定以獲得更好的效能(如 session_set_save_handler 函數中所述)。但為此,我們需要注意僅將 Session 用於驗證,而不是在腳本之間傳遞數據。

若要在腳本之間傳遞數據,請使用 GET 方法來達成目的。
To Top