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购物车类Cart.class.php定义与用法示例
Jul 20 PHP
py文件转exe时包含paramiko模块出错解决方法
Aug 12 PHP
PHP常用算法和数据结构示例(必看篇)
Mar 15 PHP
PHP设计模式之原型模式定义与用法详解
Apr 03 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
PHP array_reduce()函数的应用解析
Oct 28 PHP
PHP count()函数讲解
Feb 03 PHP
Laravel框架查询构造器简单示例
May 08 PHP
php依赖注入知识点详解
Sep 23 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 PHP
php的instanceof和判断闭包Closure操作示例
Jan 26 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安装为Apache DSO
2006/10/09 PHP
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
实例讲解PHP表单
2020/06/10 PHP
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
Javascript设计模式之装饰者模式详解篇
2017/01/17 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
python变量不能以数字打头详解
2016/07/06 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
2018/07/04 Python
Python向excel中写入数据的方法
2019/05/05 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
小米官方旗舰店:Xiaomi
2020/08/07 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
师生聚会感言
2014/01/26 职场文书
人事专员的岗位职责
2014/03/01 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
护士演讲稿优秀范文
2014/04/30 职场文书
房产公证委托书范本
2014/09/20 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
httpclient调用远程接口的方法
2022/08/14 Java/Android