前序:

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

PHP中Session ID的实现原理的更多相关文章

  1. PHP中Session ID的实现原理分析

    ession 的工作机制: 为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量.UID 存储在 cookie 中,亦或通过 URL 进行传导. PHPSESSIONID的生产 ...

  2. 设计模式之装饰模式,session共享的底层原理

    前言 还记得当初写spring-session实现分布式集群session的共享的时候,里面有说到利用filter和HttpServletRequestWrapper可以定制自己的getSession ...

  3. 解析 PHP 中 session 的实现原理以及大网站应用应该注意的问题

    一 PHP SESSION原理 session 是在服务器端保持用户会话数据的一种方法,而 cookie 是在客户端保持用户数据.HTTP 协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系 ...

  4. Flask中session实现原理

    前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...

  5. php中session_id()函数详细介绍,会话id生成过程及session id长度

    php中session_id()函数原型及说明session_id()函数说明:stringsession_id([string$id])session_id() 可以用来获取/设置 当前会话 ID. ...

  6. Cookie、Session、JWT在koa中的应用及实现原理

    目录 Cookie 重要属性 实现原理 cookie签名实现原理 注意事项 Session 实现原理 JWT 使用方式 组成 实际应用 实现原理 前端存储方式 cookie session local ...

  7. php中session原理及安全性问题

    有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制   我们先简单的了解一些http的知识,从而理解该协议 ...

  8. Session的原理,大型网站中Session方面应注意什么?

    一.Session和Cookie的区别Session是在服务器端保持会话数据的一种方法(通常用于pc端网站保持登录状态,手机端通常会使用token方式实现),存储在服务端. Cookie是在客户端保持 ...

  9. 设置aspx页面的地址栏中的Session ID的显示与隐藏

    设置aspx页面的地址栏中的Session ID的显示与隐藏修改web.config文件中的sessionState节点下的cookieless的值 1.cookieless的值是false的时候隐藏 ...

随机推荐

  1. 黑盒测试实践--Day7 12.1

    黑盒测试实践--Day7 12.1 今天完成任务情况: 录制小组作业中的自动化测试工具实践视频 汇总大家提交的各种作业模块,打包完成小组共同作业 小组成员完成个人情况说明后在截止时间前分别提交作业 小 ...

  2. 【JAVA】虚拟机指令集

    [JAVA]虚拟机指令集 – – – 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 icons ...

  3. .net Stream篇(四)

    FileStream 目录: 如何去理解FileStream? FileStream的重要性 FileStream常用构造函数(重要) 非托管参数SafeFileHandle简单介绍 FileStre ...

  4. 2014-4-2解决无法访问github和google的问题

    github是个好地方,但是上不去就蛋疼了. 今天github上不去,果断f12下,看下network,发现里面好多请求都是指向 github.global.ssl.fastly.net这个域名的,然 ...

  5. Jquery 页面元素事件绑定

    场景: 用一个Table来展示数据信息列表,通过鼠标点击Table中的Tr来获取到当前选中的数据行信息. <table class="Table" width="1 ...

  6. Oracle下载及安装

    Oracle   下载及安装 一.官方下地址:   http://www.oracle.com/technetwork/database/enterprise-edition/downloads/in ...

  7. mysql事务隔离级别回顾

    事务隔离级别是针对读数据库数据的一种规则.事务隔离级别是数据库属性不是事务属性. 1.读未提交(read uncommited) 可以读到其他事务修改未提交的数据.(有 脏读,不可重复读,幻读) 事务 ...

  8. 浅谈Spring的两种配置容器

    浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41   作者:黄小鱼ZZZ     ...

  9. luoguP4868 Preprefix sum

    https://www.luogu.org/problemnew/show/P4868 线段树上加等差数列,基础区间修改单点查询 等差数列具有可加性,当在同一段区间内时,首项相加公差相加即可 #inc ...

  10. vSphere 安装操作系统

    0.找到 vSphere Client 安装文件并安装 1.创建完成EXSI.Openfiler - 磁盘创建 * - 网卡设置 2.openfiler LVM 3.EXSI of ISCSI 4.s ...