PHP中Session ID的實現原理


前序:

首先要明白PHPSESSID看似多次刷新都不會改變其實是沒有刪除本地相關聯的cookie,刪除的方法

session_destroy();//刪除服務器端的session文件

setcookie(session_name(),'',time()-3600,'/');//刪除本地相關聯的cookie

session_unset();//清空內存中的cookie或者是$_SESSION = array(); 

然后再刷新相應的頁面你就會看到PHPSESSID會發生變化了,根據此可以得:如果session文件已經創建則不重新生成PHPSESSID,否則需要重新生成,生成規則,就看下邊嘍……!

 

--------------------------------------------------------------------------------------------------------------------------------------

現在經過測試應該是不是檢測session文件是否存在,而是檢測PHPSESSID的cookie是否存在並且是否未過期!特此更正!

------------------------------------------------------------------------------------------------

可能PHP開發者心中多少都思考過這么兩個問題:

種植在客戶端瀏覽器中的PHPSESSIONID會出現重復嗎?
PHPSESSIONID安全性如何,有沒可能被黑客輕易的仿造呢?
帶上這個問題,我稍微注意了一下PHP的源碼后,疑問也就有了答案。

PHP在使用默認的 session.save_handler = files 方式時,PHPSESSIONID的生產算法原理如下:


hash_func = md5 / sha1 #可由php.ini配置
PHPSESSIONID = hash_func(客戶端IP + 當前時間(秒)+ 當前時間(微妙)+ PHP自帶的隨機數生產器)

從以上hash_func(*)中的數據采樣值的內容分析,多個用戶在同一台服務器時所生產的PHPSESSIONID重復的概率極低(至少為百萬份之一),設想,但台動態Web Server能到2000/rps已經很強悍了。

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

以下是截取PHP源碼中PHPSESSIONID實現片段:

gettimeofday(&tv, NULL);

if (
zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &array) == SUCCESS &&
Z_TYPE_PP(array) == IS_ARRAY && zend_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR", sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS)
{
    remote_addr = Z_STRVAL_PP(token);
}


spprintf(&buf, 0, "%.15s%ld%ld%0.8F", remote_addr ? remote_addr : "", tv.tv_sec, (long int)tv.tv_usec, php_combined_lcg(TSRMLS_C) * 10);

switch (PS(hash_func))
{
case PS_HASH_FUNC_MD5:
    PHP_MD5Init(&md5_context);
    PHP_MD5Update(&md5_context, (unsigned char *) buf, strlen(buf));
    digest_len = 16;
    break;
case PS_HASH_FUNC_SHA1:
    PHP_SHA1Init(&sha1_context);
    PHP_SHA1Update(&sha1_context, (unsigned char *) buf, strlen(buf));
    digest_len = 20;
    break;
default:
    php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid session hash function");
    efree(buf);
    return NULL;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM