PHP Session ID的實(shí)現(xiàn)原理與實(shí)例
Session作用
Session的根本作用就是在服務(wù)端存儲(chǔ)用戶和服務(wù)器會(huì)話的一些信息。典型的應(yīng)用有:
1、判斷用戶是否登錄。
2、購(gòu)物車功能。
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)算法原理:
1、hash_func = md5 / sha1 #可由php.ini配置
2、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ù)的概率極低。
另外,黑客如果要猜出某一用戶的PHPSESSIONID,則他也必須知道“客戶端IP、當(dāng)前時(shí)間(秒、微妙)、隨機(jī)數(shù)”等數(shù)據(jù)方可模擬。
php.ini配置如下:
; 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文件的讀寫(xiě)操作即實(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傳輸。
session.use_cookies = 0 //設(shè)置客戶端是否使用cookie來(lái)保存session值 該參數(shù)的值不影響上述機(jī)制的進(jìn)行。
但是為了驗(yàn)證該機(jī)制,這里把該參數(shù)設(shè)為0,排除cookie攜帶seesionid的可能
session.use_only_cookies = 0 //是否只使用cookie來(lái)保存session值 該參數(shù)為1時(shí),上述機(jī)制失效。
設(shè)置session.use_trans_sid = 1或者編譯時(shí)打開(kāi)打開(kāi)了--enable-trans-sid每次請(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);
Session實(shí)例問(wèn)題
現(xiàn)有系統(tǒng)A,B; 假設(shè)A系統(tǒng)是可以獨(dú)立運(yùn)行的web系統(tǒng),即可以和瀏覽器直接處理session, B系統(tǒng)是基于mobile的,需要調(diào)用A系統(tǒng)的功能接口,
在保持A不改變的情況下,即登陸驗(yàn)證,session存儲(chǔ)都不變的情況下,B系統(tǒng)能處理前端用戶的請(qǐng)求。
這里提供的方案是使用PHP實(shí)現(xiàn)
在用戶登陸成功后,將保存的session的session-id返回給B系統(tǒng),然后B系統(tǒng)每次請(qǐng)求其他接口都帶session_id。
?。料到y(tǒng)在session_start前加上session_id(session_id);
這樣B系統(tǒng)就能安全的調(diào)用A
session安全問(wèn)題
再聊下session_id吧,它是保存在cookie中,首先session是一個(gè)只要活動(dòng)就不會(huì)過(guò)期的東西,只要開(kāi)啟cookie,每一次會(huì)話,session_id都不會(huì)改變,我們可以根據(jù)session_id來(lái)判斷用戶是否是正常登陸,防止用戶偽造session。然后我們也要防止session被劫持,我們可以對(duì)session_id進(jìn)行再一次的加密,防止暴力破解,還有可以設(shè)置HttpOnly。通過(guò)設(shè)置Cookie的HttpOnly為true,可以防止客戶端腳本訪問(wèn)這個(gè)Cookie,從而有效的防止XSS攻擊。
以上就是PHP Session ID的實(shí)現(xiàn)原理與實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于PHP Session ID的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php數(shù)組函數(shù)序列之a(chǎn)rray_slice() - 在數(shù)組中根據(jù)條件取出一段值,并返回
array_slice() 函數(shù)在數(shù)組中根據(jù)條件取出一段值,并返回2011-11-11PHP實(shí)現(xiàn)克魯斯卡爾算法實(shí)例解析
這篇文章主要介紹了PHP實(shí)現(xiàn)克魯斯卡爾算法實(shí)例解析,是PHP程序設(shè)計(jì)中一個(gè)比較經(jīng)典的應(yīng)用,需要的朋友可以參考下2014-08-08PHP面向?qū)ο笞詣?dòng)加載機(jī)制原理與用法分析
這篇文章主要介紹了PHP面向?qū)ο笞詣?dòng)加載機(jī)制原理與用法,結(jié)合實(shí)例形式分析了php面向?qū)ο笞詣?dòng)加載機(jī)制的原理、相關(guān)函數(shù)及注意事項(xiàng),需要的朋友可以參考下2016-10-10PHP批量獲取網(wǎng)頁(yè)中所有固定種子鏈接的方法
這篇文章主要介紹了PHP批量獲取網(wǎng)頁(yè)中所有固定種子鏈接的方法,涉及php字符串與文件操作的相關(guān)技巧,需要的朋友可以參考下2016-11-11PHP常見(jiàn)加密函數(shù)用法示例【crypt與md5】
這篇文章主要介紹了PHP常見(jiàn)加密函數(shù)用法,結(jié)合實(shí)例形式分析了crypt與md5函數(shù)進(jìn)行加密操作相關(guān)使用技巧與注意事項(xiàng),需要的朋友可以參考下2019-01-01Laravel框架使用技巧之使用url()全局函數(shù)返回前一個(gè)頁(yè)面的地址方法詳解
這篇文章主要介紹了Laravel框架使用技巧之使用url()全局函數(shù)返回前一個(gè)頁(yè)面的地址,需要的朋友可以參考下2020-04-04