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 相关文章推荐
第十四节 命名空间 [14]
Oct 09 PHP
php中获取远程客户端的真实ip地址的方法
Aug 03 PHP
PHP 登录记住密码实现思路
May 07 PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
PHP易混淆知识整理笔记
Sep 24 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
php查询操作实现投票功能
May 09 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
Apr 14 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
CodeIgniter安全相关设置汇总
2014/07/03 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
js 加载时自动调整图片大小
2008/05/28 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
JQuery基础语法小结
2015/02/27 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
Python中用max()方法求最大值的介绍
2015/05/15 Python
python 实现红包随机生成算法的简单实例
2017/01/04 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
详解python调用cmd命令三种方法
2019/07/08 Python
django页面跳转问题及注意事项
2019/07/18 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
Python 日期的转换及计算的具体使用详解
2020/01/16 Python
英国领先的男士美容护发用品公司:Mankind
2016/08/31 全球购物
司机的工作范围及职责
2013/11/13 职场文书
护士毕业自我鉴定
2014/02/07 职场文书
护士毕业生自我鉴定
2014/02/08 职场文书
施工安全承诺书
2014/05/22 职场文书
统计工作个人总结
2015/03/03 职场文书
七一晚会主持词
2015/06/29 职场文书
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
你知道Java Spring的两种事务吗
2022/03/16 Java/Android