1. 程式人生 > 程式設計 >PHP Session ID的實現原理與例項

PHP Session ID的實現原理與例項

Session作用

  Session的根本作用就是在服務端儲存使用者和伺服器會話的一些資訊。典型的應用有:
  1、判斷使用者是否登入。
  2、購物車功能。

session 的工作機制:

為每個訪問者建立一個唯一的 id (UID),並基於這個 UID 來儲存變數。UID 儲存在 cookie 中,亦或通過 URL 進行傳導。

phpSESSIONID的生產演算法原理:

1、hash_func = md5 /程式設計客棧 sha1 #可由php.ini配置

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

從以上hash_func(*)中的資料取樣值的內容分析,多個使用者在同一臺伺服器時所生產的PHPSESSIONID重複的概率極低。

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

php.ini配置如下:

; http://php.net/session.hash-function
session.hash_function=0

PHP Session工作原理

以下以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傳輸。

session.use_cookies = 0 //設定客戶端是否使用cookie來儲存session值 該引數的值不影響上述機制的進行。

但是為了驗證該機制,這裡把該引數設為0,排除cookie攜帶seesionid的可能

ses程式設計客棧sion.use_only_cookies = 0 //是否只使用cookie來儲存session值 該引數為1時,上述機制失效。

設定session.use_tr程式設計客棧ans_sid = 1或者編譯時開啟打開了--enable-trans-sid每次請求的地址裡面都會補全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);

Session例項問題

現有系統A,B; 假設A系統是可以獨立執行的web系統,即可以和瀏覽器直接處理session, B系統是基於mobile的,需要呼叫A系統的功能介面,

  在保持A不改變的情況下,即登陸驗證,session儲存都不變的情況下,B系統能處理前端使用者的請求。

  這裡提供的方案是使用PHP實現

  在使用者登陸成功後,將http://www.cppcns.com儲存的session的session-id返回給B系統,然後B系統每次請求其他介面都帶session_id。

  A系統在session_start前加上session_id(session_id);

  這樣B系統就能安全的呼叫A

session安全問題

再聊下session_id吧,它是儲存在cookie中,首先session是一個只要活動就不會過期的東西,只要開啟cookie,每一次會話,session_id都不會改變,我們可以根據session_id來判斷使用者是否是正常登陸,防止使用者偽造session。然後我們也要防止session被劫持,我們可以對session_id進行再一次的加密,防止暴力破解,還有可以設定HttpOnly。通過設定Cookie的HttpOnly為true,可以防止客戶端指令碼訪問這個Cookie,從而有效的防止XSS攻擊。

以上就是PHP Session ID的實現原理與例項的詳細內容,更多關於PHP Session ID的資料請關注我們其它相關文章!