PHP中Session ID的實現原理分析

ession 的工做機制:php

爲每一個訪問者建立一個惟一的 id (UID),並基於這個 UID 來存儲變量。UID 存儲在 cookie 中,亦或經過 URL 進行傳導。算法

PHPSESSIONID的生產算法原理:服務器

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

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

從以上hash_func(*)中的數據採樣值的內容分析,多個用戶在同一臺服務器時所生產的PHPSESSIONID重複的機率極低。url

另外,黑客若是要猜出某一用戶的PHPSESSIONID,則他也必須知道「客戶端IP、當前時間(秒、微妙)、隨機數」等數據方可模擬。spa

php.ini配置以下:.net

1code

2md5

3

4

5

6

7

8

9

; 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

PHP Session工做原理

如下以cookie傳輸PHPSESSID描述。

一、客戶端請求一個php的服務端地址。

二、服務端收到請求,這次php腳本中包含session_start()

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

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

五、此時,客戶端的cookie裏面包含了PHPSESSID,以後客戶端的每次請求首部Request HeadersCookie: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的目的,很是方便。

例如:

1

2

3

4

5

<?php

// session_id('vingbrv8m64asth0nhplu9gmb7');

session_start();

$_SESSION[md5(rand(100,999))] = rand(100,999);

var_dump($_SESSION);

相關文章
相關標籤/搜索