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字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
Nov 10 PHP
PHP中的正则表达式函数介绍
Feb 27 PHP
基于PHP CURL用法的深入分析
Jun 09 PHP
2014年10个最佳的PHP图像操作库
Jul 14 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
PHP 验证登陆类分享
Mar 13 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
详解PHP的Yii框架中扩展的安装与使用
Apr 01 PHP
php版微信返回用户text输入的方法
Nov 14 PHP
Yii2配置Nginx伪静态的方法
May 05 PHP
PHP实现的函数重载功能示例
Aug 03 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 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源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
PHP7变量处理机制修改
2021/03/09 PHP
用js判断输入是否为中文的函数
2014/03/10 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
JavaScript判断数字是否为质数的方法汇总
2016/06/02 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
浅谈JS函数节流防抖
2017/10/18 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
浅谈Python中函数的参数传递
2016/06/21 Python
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
Python实现数字的格式化输出
2020/08/01 Python
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
JAVA代码查错题
2014/10/10 面试题
工商管理专业应届生求职信
2013/11/04 职场文书
食品营养与检测应届生求职信
2013/11/08 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
股东合作协议书
2014/09/12 职场文书
初中毕业生自我评价
2015/03/02 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
小学教研工作总结2015
2015/05/13 职场文书