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 相关文章推荐
用cookies来跟踪识别用户
Oct 09 PHP
在IIS上安装PHP4.0正式版
Oct 09 PHP
php数据库配置文件一般做法分享
Jul 07 PHP
php笔记之:初探PHPcms模块开发介绍
Apr 26 PHP
PHP中isset()和unset()函数的用法小结
Mar 11 PHP
PHP连接sql server 2005环境配置及问题解决
Aug 08 PHP
php数据访问之增删改查操作
May 09 PHP
Laravel的throttle中间件失效问题解决方法
Oct 09 PHP
php 三元运算符实例详细介绍
Dec 15 PHP
php-fpm中max_children的配置
Mar 15 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
Jul 19 PHP
php redis setnx分布式锁简单原理解析
Oct 23 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
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
php中使用array_filter()函数过滤空数组的实现代码
2014/08/19 PHP
php密码生成类实例
2014/09/24 PHP
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
python错误处理详解
2014/09/28 Python
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
html5组织文档结构_动力节点Java学院整理
2017/07/11 HTML / CSS
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
一个精品风格的世界:Atterley
2019/05/01 全球购物
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
五十岁生日宴会答谢词
2014/01/15 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
美术教师岗位职责
2014/03/18 职场文书
毕业自我鉴定怎么写
2014/03/25 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
二手房购房协议书范本
2014/10/05 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
质量整改报告范文
2014/11/08 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法
2021/11/21 数码科技
Windows server 2012搭建FTP服务器
2022/04/29 Servers