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 相关文章推荐
一个可查询所有表的“通用”查询分页类
Oct 09 PHP
PHPShop存在多个安全漏洞
Oct 09 PHP
一个从别的网站抓取信息的例子(域名查询)
Oct 09 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
Jul 07 PHP
php和js如何通过json互相传递数据相关问题探讨
Feb 26 PHP
PHP小教程之实现链表
Jun 09 PHP
jQuery Mobile + PHP实现文件上传
Dec 12 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
Mar 10 PHP
PHP常用的小程序代码段
Nov 14 PHP
php str_getcsv把字符串解析为数组的实现方法
Apr 05 PHP
Laravel框架实现redis集群的方法分析
Sep 14 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
Oct 30 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短域名转换为实际域名函数
2011/01/17 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
2016/02/01 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
JSON 数据格式介绍
2012/01/13 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
2015/06/18 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
浅谈JS运算符&amp;&amp;和|| 及其优先级
2016/08/10 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
JavaScript中的类型检查
2020/02/03 Javascript
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
python实现统计代码行数的小工具
2019/09/19 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
Python进程间通信multiprocess代码实例
2020/03/18 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
用C语言实现文件读写操作
2013/10/27 面试题
天网面试题
2013/04/07 面试题
业务经理的岗位职责
2013/11/16 职场文书
办公室前台的岗位职责
2013/12/20 职场文书
高一家长会邀请函
2014/01/12 职场文书
单位创先争优活动方案
2014/01/26 职场文书
职工运动会邀请函
2014/02/02 职场文书
食堂厨师岗位职责
2014/08/25 职场文书
销售人才自我评价范文
2014/09/27 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
公司年会开场白
2015/06/01 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
500字作文之关于爸爸
2019/11/14 职场文书
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python