PHP中Session ID的實現原理
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開源社群,或者訪問:
- 基於Nginx的負載均衡原理與實戰
- PHP控制反轉(IOC)和依賴注入(DI)
- 深入理解PHP7核心之Reference
- php中類的不定引數使用示例
- php單例模式的常見應用場景
- laravel 配置MySQL讀寫分離
- PHP的垃圾回收機制(建議收藏)
- 【shell指令碼】字串和陣列的使用
- PHP-FPM是什麼東東?
- PHP 編寫守護程序
- PHP命令列指令碼接收傳入引數的三種方式
- php專案中類的自動載入
- 複習下Linux去除重複項命令uniq
- 深入理解PHP核心:變數及資料型別
- Swoole協程與傳統fpm同步模式比較
- PHP中Session ID的實現原理
- 寫一手好SQL,該從哪裡入手最好?
- PHP命令列指令碼接收傳入引數的三種方式
- 使用 Shell 在多伺服器上批量操作
- PHP實現使用者異地登入提醒功能的方法