PHP中Session ID的實現原理

語言: CN / TW / HK

Session 的工作機制是:為每個訪問者創建一個唯一的 id (UID),並基於這個 UID 來存儲變量。UID 存儲在 cookie 中,亦或通過 URL 進行傳導。

PHPSESSIONID的生產算法原理如下:

hash_func = md5 / sha1 #可由php.ini配置

PHPSESSIONID = hash_func(客户端IP + 當前時間(秒)+ 當前時間(微妙)+ PHP自帶的隨機數生產器)

從以上hash_func(*)中的數據採樣值的內容分析,多個用户在同一台服務器時所生產的PHPSESSIONID重複的概率極低(至少為百萬份之一),設想,但台動態Web Server能到2000/rps已經很強悍了。

另外,黑客如果要猜出某一用户的PHPSESSIONID,則他也必須知道“客户端IP、當前時間(秒、微妙)、隨機數”等數據方可模擬。

php.ini配置如下:

; Select a hash function for use in generating session ids.
; Possible Values
;   0  (MD5 128 bits)
;   1  (SHA-1 160 bits)
; This option may also be set to the name of any hash function supported by
; the hash extension. A list of available hashes is returned by the hash_algos()
; function.
; http://php.net/session.hash-function
session.hash_function=0

以下以cookie傳輸PHPSESSID描述。


1. 客户端請求一個php的服務端地址。

2. 服務端收到請求,此次php腳本中包含session_start()。

3. 服務端會生成一個PHPSESSID。(默認session存儲方式為session.save_handler=files,文件形式存儲。生成的session文件名規則即為sess_PHPSESSID,session文件存在session.save_path中。)

4. 服務端響應首部Response Headers:Set-Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50; path=/。在客户端生成一個cookie保存此PHPSESSID。

5. 此時,客户端的cookie裏面包含了PHPSESSID,之後客户端的每次請求首部Request Headers:Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50。服務端之後每次接收到客户端的請求就都能根據這個

PHPSESSID來找到服務端的session文件,通過對這個session文件的讀寫操作即實現了session的超全局變量屬性。

如果客户端禁用了cookie,由於無法使用cookie傳遞PHPSESSID,那麼客户端每次請求,服務端都會重新建立一個session文件,而無法通過通過PHPSESSID來重用session文件,所以session也就失效了。

這種情況可以設置session.use_trans_sid來傳輸PHPSESSID,具體實現方式與cookie的區別就是將PHPSESSID通過HTTP的GET傳輸。每次請求的地址裏面都會補全PHPSESSID參數”url?

PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50”來實現。

【PHPcli模式通過session_id()使用session】

可以通過它來獲取當前會話的PHPSESSID,也可以通過它來設置當前的會話PHPSESSID。

PHPcli模式下可以通過設置這個,達到使用session的目的,非常方便。

例如:

<?php
// session_id('vingbrv8m64asth0nhplu9gmb7');
session_start();
$_SESSION[md5(rand(100,999))] = rand(100,999);
var_dump($_SESSION);

以上內容希望幫助到大家,更多PHP大廠PDF面試文檔,PHP進階架構視頻資料,PHP精彩好文免費獲取可以關注公眾號:PHP開源社區,或者訪問:

2021金三銀四大廠面試真題集錦,必看!

騰訊一面的Redis秒殺面試題你會麼?

四年精華PHP技術文章整理合集——PHP框架篇

四年精華PHP技術文合集——微服務架構篇

四年精華PHP技術文合集——分佈式架構篇

四年精華PHP技術文合集——高併發場景篇

四年精華PHP技術文章整理合集——數據庫篇