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作的文本留言本的例子(二)
Oct 09 PHP
php下一个阿拉伯数字转中文数字的函数
Jul 16 PHP
PHP Google的translate API代码
Dec 10 PHP
PHP 作用域解析运算符(::)
Jul 27 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Jan 27 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 PHP
php模拟登陆的实现方法分析
Jan 09 PHP
php内嵌函数用法实例
Mar 20 PHP
从刷票了解获得客户端IP的方法
Sep 21 PHP
PHP实现的简单分页类及用法示例
May 06 PHP
PHP检测链接是否存在的代码实例分享
May 06 PHP
php微信公众号开发之秒杀
Oct 20 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
PHP校验ISBN码的函数代码
2011/01/17 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
ThinkPHP中where()使用方法详解
2016/04/19 PHP
Yii2框架实现注册和登录教程
2016/09/30 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
原生js获取left值和top值的三种方法
2017/08/02 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
vue设置默认首页的操作
2020/08/12 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
Python中常见的异常总结
2018/02/20 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
2019/08/02 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
加拿大时装零售商:Influence U
2018/12/22 全球购物
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
线程同步的方法
2016/11/23 面试题
热爱祖国演讲稿
2014/05/04 职场文书
党员一帮一活动总结
2014/07/08 职场文书
大学生党校培训心得体会
2014/09/11 职场文书
2014年学前班工作总结
2014/12/08 职场文书
校长一岗双责责任书
2015/05/09 职场文书
新年晚会开场白
2015/05/29 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android