前序:

首先要明白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;
}

最新文章

  1. 阿里云自定义日记文件无法通过ftp下载
  2. SQL分页语句
  3. cocos2d-x 3.0 版本 骨骼动画设置shader
  4. HD1580(尼姆博弈入门)
  5. 黄聪:chrome扩展开发《AJAX请求》
  6. 写一个函数,实现两个字符串的比较。即实现strcmp函数,s1=s2时返回0,s1!=s2时返回二者第一个不同字符的ASCII值。
  7. iOS之H5和Native混合开发
  8. codeforces 235 B. Let's Play Osu!
  9. sso单点登录解决方案收集
  10. 利用分布类防止EF更新模型丢失验证信息
  11. c#定义一个方法,根据存储过程名称和存储过程参数数组,执行对应的存储过程
  12. call_grant_sel.sql
  13. 爬虫-request以及beautisoup模块笔记
  14. js中Array数组基本方法
  15. Django url
  16. mysql的使用
  17. php urldecode 与rawdecode
  18. Alpha阶段敏捷冲刺(八)
  19. 【转载】win7搜索文件怎么搜索文件名中带圆括号的文件
  20. javascript自动填写表单小技巧

热门文章

  1. Palindromeness CodeChef - PALPROB
  2. (转)什么?你还不会写JQuery 插件
  3. android eclipse 报error loading /system/media/audio/ xxx 错的解决办法。
  4. C# Path类常用方法
  5. .NET架构转Java开发必须了解的历史
  6. CentOS Vi编辑器
  7. c++缓冲区------c++ Primer Plus
  8. Markdown使用样例
  9. 【转】分析.net中的object sender与EventArgs e
  10. 【bzoj3576】[Hnoi2014]江南乐 数论分块+博弈论