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 无法加载mysql的module的时候的配置的解决方案引发的思考
Jan 27 PHP
用Php编写注册后Email激活验证的实例代码
Mar 11 PHP
ThinkPHP模板比较标签用法详解
Jun 30 PHP
php学习笔记之面向对象
Nov 08 PHP
php中PDO方式实现数据库的增删改查
May 17 PHP
ThinkPHP中html:list标签用法分析
Jan 09 PHP
php微信支付接口开发程序
Aug 02 PHP
PHP实现多图上传和单图上传功能
May 17 PHP
mongodb和php的用法详解
Mar 25 PHP
Codeigniter里的无刷新上传的实现代码
Apr 14 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
Jul 26 PHP
php链式操作的实现方式分析
Aug 12 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 array_map()数组函数使用说明
2011/07/12 PHP
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
JavaScript极简入门教程(一):基础篇
2014/10/25 Javascript
浅谈js中的闭包
2015/03/16 Javascript
javascript每日必学之封装
2016/02/23 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
webpack打包js的方法
2018/03/12 Javascript
Vue中props的使用详解
2018/06/15 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
layui实现数据分页功能
2019/07/27 Javascript
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
利用python代码写的12306订票代码
2015/12/20 Python
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
董事长秘书岗位职责
2013/11/29 职场文书
思想品德自我评价
2014/02/04 职场文书
旅游市场营销方案
2014/03/09 职场文书
计划生育宣传标语
2014/06/21 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
Python 数据可视化之Matplotlib详解
2021/11/02 Python