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 一元分词算法
Nov 30 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
PHP中生成UUID自定义函数分享
Jun 10 PHP
PHP执行SQL文件并将SQL文件导入到数据库
Sep 17 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
Jan 07 PHP
Yii2如何批量添加数据
May 17 PHP
php使用Jpgraph创建折线图效果示例
Feb 15 PHP
PHP实现权限管理功能示例
Sep 22 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 PHP
laravel添加角色和模糊搜索功能的实现代码
Jun 22 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蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
2019/03/21 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
js实现转动骰子模型
2019/10/24 Javascript
Python批量按比例缩小图片脚本分享
2015/05/21 Python
python的多重继承的理解
2017/08/06 Python
基于Python闭包及其作用域详解
2017/08/28 Python
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
浅谈numpy数组中冒号和负号的含义
2018/04/18 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
详解python中eval函数的作用
2019/10/22 Python
django实现类似触发器的功能
2019/11/15 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
物业保安员岗位职责制度
2014/01/30 职场文书
《两只鸟蛋》教学反思
2014/02/10 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
运动会加油稿20字
2014/11/15 职场文书
刑事法律意见书
2015/06/04 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
Flask搭建一个API服务器的步骤
2021/05/28 Python