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 获取select下拉列表框的值
May 08 PHP
字母顺序颠倒而单词顺序不变的php代码
Aug 08 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
Oct 08 PHP
ThinkPHP模版引擎之变量输出详解
Dec 05 PHP
PHP中使用break跳出多重循环代码实例
Jan 21 PHP
php读取文件内容的方法汇总
Jan 24 PHP
php数组索引与键值操作技巧实例分析
Jun 24 PHP
PHP递归创建多级目录
Nov 05 PHP
对于Laravel 5.5核心架构的深入理解
Feb 22 PHP
tp5框架内使用tp3.2分页的方法分析
May 05 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 PHP
聊聊 PHP 8 新特性 Attributes
Aug 19 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 更新数据库中断的解决方法
2009/06/05 PHP
PHP foreach循环使用详解与实例代码
2010/05/08 PHP
php导出excel格式数据问题
2014/03/11 PHP
php中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
php算法实例分享
2015/07/14 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
2018/12/21 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
高中生学习总结的自我评价范文
2013/10/13 职场文书
建筑施工员岗位职责
2013/11/26 职场文书
班主任先进事迹材料
2014/12/17 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
《颐和园》教学反思
2016/02/19 职场文书
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript