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
Dec 23 PHP
PHP5 操作MySQL数据库基础代码
Sep 29 PHP
PHP 飞信好友免费短信API接口开源版
Jul 22 PHP
php数组函数序列之array_sum() - 计算数组元素值之和
Oct 29 PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 PHP
Zend的MVC机制使用分析(一)
May 02 PHP
ThinkPHP路由机制简介
Mar 23 PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 PHP
thinkphp 验证码 的使用小结
May 07 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
laravel 解决路由除了根目录其他都404的问题
Oct 18 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
jQuery 技巧小结
2010/04/02 Javascript
jquery $.each() 使用小探
2013/08/23 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
微信小程序自定义波浪组件使用方法详解
2019/09/21 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
django使用多个数据库的方法实例
2021/03/04 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
韩国休闲女装品牌网站:ANAIS
2016/08/24 全球购物
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
上海某公司.net方向笔试题
2014/09/14 面试题
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
出纳岗位职责
2013/11/09 职场文书
工作岗位职责范本
2015/02/15 职场文书