PHP中Session ID的实现原理实例分析


Posted in PHP onAugust 17, 2019

本文实例讲述了PHP中Session ID的实现原理。分享给大家供大家参考,具体如下:

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

PHPSESSIONID的生产算法原理如下:

hash_func = md5 / sha1 #可由php.ini配置

PHPSESSIONID = hash_func(客户端IP + 当前时间(秒)+ 当前时间(微妙)+ PHP自带的随机数生产器)

从以上hash_func(*)中的数据采样值的内容分析,多个用户在同一台服务器时所生产的PHPSESSIONID重复的概率极低(至少为百万份之一),设想,但台动态Web Server能到2000/rps已经很强悍了。

另外,黑客如果要猜出某一用户的PHPSESSIONID,则他也必须知道“客户端IP、当前时间(秒、微妙)、随机数”等数据方可模拟。

php.ini配置如下:

; Select a hash function for use in generating session ids.
; Possible Values
;  0 (MD5 128 bits)
;  1 (SHA-1 160 bits)
; This option may also be set to the name of any hash function supported by
; the hash extension. A list of available hashes is returned by the hash_algos()
; function.
; 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传输。每次请求的地址里面都会补全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);

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
php中全局变量global的使用演示代码
May 18 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
Aug 11 PHP
PHP及Zend Engine的线程安全模型分析
Nov 10 PHP
解析php中eclipse 用空格替换 tab键
Jun 24 PHP
PHP中的str_repeat函数在JavaScript中的实现
Sep 16 PHP
php获取淘宝分类id示例
Jan 16 PHP
php递归json类实例
Dec 02 PHP
php目录拷贝实现方法
Jul 10 PHP
CodeIgniter控制器之业务逻辑实例分析
Jan 20 PHP
php模拟post上传图片实现代码
Jun 24 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 PHP
解决php extension 加载顺序问题
Aug 16 #PHP
深入学习微信网址链接解封的防封原理visit_type
Aug 15 #PHP
Thinkphp5框架实现获取数据库数据到视图的方法
Aug 14 #PHP
php中对象引用和复制实例分析
Aug 14 #PHP
php5对象复制、clone、浅复制与深复制实例详解
Aug 14 #PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
Aug 14 #PHP
PHP命名空间定义与用法实例分析
Aug 14 #PHP
You might like
一个用php实现的获取URL信息的类
2007/01/02 PHP
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
2020/06/03 PHP
javascript 面向对象思想 附源码
2009/07/07 Javascript
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
js有关元素内容操作小结
2011/12/20 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
利用Python获取操作系统信息实例
2016/09/02 Python
python3.6 实现AES加密的示例(pyCryptodome)
2018/01/10 Python
聊聊Python中的pypy
2018/01/12 Python
简单实现python聊天程序
2018/04/01 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
关于python中导入文件到list的问题
2020/10/31 Python
英国现代绅士品牌:Hackett
2017/12/17 全球购物
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
JPA的特点
2014/10/25 面试题
工作会议欢迎词
2014/01/16 职场文书
高二历史教学反思
2014/01/25 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
基层党支部公开承诺书
2014/05/29 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
环卫工人节活动总结
2014/08/29 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
雷锋观后感
2015/06/10 职场文书