PHP中Session ID的實(shí)現(xiàn)原理實(shí)例分析
本文實(shí)例講述了PHP中Session ID的實(shí)現(xiàn)原理。分享給大家供大家參考,具體如下:
Session 的工作機(jī)制是:為每個(gè)訪問(wèn)者創(chuàng)建一個(gè)唯一的 id (UID),并基于這個(gè) UID 來(lái)存儲(chǔ)變量。UID 存儲(chǔ)在 cookie 中,亦或通過(guò) URL 進(jìn)行傳導(dǎo)。
PHPSESSIONID的生產(chǎn)算法原理如下:
hash_func = md5 / sha1 #可由php.ini配置
PHPSESSIONID = hash_func(客戶端IP + 當(dāng)前時(shí)間(秒)+ 當(dāng)前時(shí)間(微妙)+ PHP自帶的隨機(jī)數(shù)生產(chǎn)器)
從以上hash_func(*)中的數(shù)據(jù)采樣值的內(nèi)容分析,多個(gè)用戶在同一臺(tái)服務(wù)器時(shí)所生產(chǎn)的PHPSESSIONID重復(fù)的概率極低(至少為百萬(wàn)份之一),設(shè)想,但臺(tái)動(dòng)態(tài)Web Server能到2000/rps已經(jīng)很強(qiáng)悍了。
另外,黑客如果要猜出某一用戶的PHPSESSIONID,則他也必須知道“客戶端IP、當(dāng)前時(shí)間(秒、微妙)、隨機(jī)數(shù)”等數(shù)據(jù)方可模擬。
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
【PHP session工作原理】
以下以cookie傳輸PHPSESSID描述。
1. 客戶端請(qǐng)求一個(gè)php的服務(wù)端地址。
2. 服務(wù)端收到請(qǐng)求,此次php腳本中包含session_start()。
3. 服務(wù)端會(huì)生成一個(gè)PHPSESSID。(默認(rèn)session存儲(chǔ)方式為session.save_handler=files,文件形式存儲(chǔ)。生成的session文件名規(guī)則即為sess_PHPSESSID,session文件存在session.save_path中。)
4. 服務(wù)端響應(yīng)首部Response Headers:Set-Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50; path=/。在客戶端生成一個(gè)cookie保存此PHPSESSID。
5. 此時(shí),客戶端的cookie里面包含了PHPSESSID,之后客戶端的每次請(qǐng)求首部Request Headers:Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50。服務(wù)端之后每次接收到客戶端的請(qǐng)求就都能根據(jù)這個(gè)
PHPSESSID來(lái)找到服務(wù)端的session文件,通過(guò)對(duì)這個(gè)session文件的讀寫操作即實(shí)現(xiàn)了session的超全局變量屬性。
如果客戶端禁用了cookie,由于無(wú)法使用cookie傳遞PHPSESSID,那么客戶端每次請(qǐng)求,服務(wù)端都會(huì)重新建立一個(gè)session文件,而無(wú)法通過(guò)通過(guò)PHPSESSID來(lái)重用session文件,所以session也就失效了。
這種情況可以設(shè)置session.use_trans_sid來(lái)傳輸PHPSESSID,具體實(shí)現(xiàn)方式與cookie的區(qū)別就是將PHPSESSID通過(guò)HTTP的GET傳輸。每次請(qǐng)求的地址里面都會(huì)補(bǔ)全PHPSESSID參數(shù)”url?
PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50”來(lái)實(shí)現(xiàn)。
【PHPcli模式通過(guò)session_id()使用session】
可以通過(guò)它來(lái)獲取當(dāng)前會(huì)話的PHPSESSID,也可以通過(guò)它來(lái)設(shè)置當(dāng)前的會(huì)話PHPSESSID。
PHPcli模式下可以通過(guò)設(shè)置這個(gè),達(dá)到使用session的目的,非常方便。
例如:
<?php // session_id('vingbrv8m64asth0nhplu9gmb7'); session_start(); $_SESSION[md5(rand(100,999))] = rand(100,999); var_dump($_SESSION);
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php緩存技術(shù)總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《PHP錯(cuò)誤與異常處理方法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- php中session_id()函數(shù)詳細(xì)介紹,會(huì)話id生成過(guò)程及session id長(zhǎng)度
- php查看當(dāng)前Session的ID實(shí)例
- PHP修改session_id示例代碼
- PHP通過(guò)session id 實(shí)現(xiàn)session共享和登錄驗(yàn)證的代碼
- PHP Session_Regenerate_ID函數(shù)雙釋放內(nèi)存破壞漏洞
- php生成SessionID和圖片校驗(yàn)碼的思路和實(shí)現(xiàn)代碼
- PHP Session ID的實(shí)現(xiàn)原理與實(shí)例
相關(guān)文章
PHP實(shí)現(xiàn)的抓取小說(shuō)網(wǎng)站內(nèi)容功能示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的抓取小說(shuō)網(wǎng)站內(nèi)容功能,涉及php頁(yè)面抓取、正則匹配、文件讀寫等相關(guān)操作技巧,需要的朋友可以參考下2019-06-06利用PHP擴(kuò)展vld查看PHP opcode操作步驟
首先下載最新版vld擴(kuò)展接下來(lái)編譯安裝vld擴(kuò)展最后將生成的vld.so復(fù)制到extension_dir目錄下然后修改php.ini文件接下來(lái)創(chuàng)建test.php文件,感興趣的你可以參考下本文2013-03-03令PHP初學(xué)者頭疼十四條問(wèn)題大總結(jié)
今天為大家奉上令PHP初學(xué)者頭疼問(wèn)題大總結(jié),下面提出的14個(gè)問(wèn)題希望對(duì)PHP初學(xué)者有所幫助。2008-11-11簡(jiǎn)單實(shí)現(xiàn)php上傳文件功能
這篇文章主要教大家如何簡(jiǎn)單實(shí)現(xiàn)php上傳文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09php跨域檢測(cè)類允許部分域名訪問(wèn)的示例詳解
PHP跨域檢測(cè)類是一種封裝了跨域檢測(cè)邏輯的PHP類,它可以用于在PHP應(yīng)用程序中檢測(cè)和處理跨域請(qǐng)求,以確保安全和正常的跨域通信,本文給出了示例給大家介紹php如何允許部分域名訪問(wèn),需要的朋友可以參考下2023-12-12