PHP中Session ID的实现原理

本文探讨了PHP SESSIONID的生成算法及安全性问题,通过分析客户端浏览器中的PHPSESSIONID生成机制,评估其重复概率和被破解的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

可能PHP开发者心中多少都思考过这么两个问题:

  1. 种植在客户端浏览器中的PHPSESSIONID会出现重复吗?
  2. 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);
}

/* maximum 15+19+19+10 bytes */
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值