Session 的工作机制:

为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。

PHPSESSIONID的生产算法原理:

1、hash_func = md5 / sha1 #可由php.ini配置

2、PHPSESSIONID = hash_func(客户端IP + 当前时间(秒)+ 当前时间(微妙)+ PHP自带的随机数生产器)

从以上hash_func(*)中的数据采样值的内容分析,多个用户在同一台服务器时所生产的PHPSESSIONID重复的概率极低。

另外,黑客如果要猜出某一用户的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-functionsession.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 HeadersCookie: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 session (包含图文、视频、案例)

更多相关文章

  1. php实时推送系统消息给客户端的原理及详解
  2. 干掉Navicat!MySQL官方客户端到底行不行?
  3. Github标星 8K+,免费又好用的Redis客户端工具!
  4. 技术干货 | mPaaS 客户端问题排查:漫长的 3s 等待之谜
  5. centos7搭建NFS客户端以及NFS详细步骤
  6. Zabbix5.0服务端和客户端安装
  7. 客户端请求服务器时的状态码讲解
  8. 服务端指南 数据存储篇 | MySQL(09) 分库与分表带来的分布式困境与
  9. 服务端指南 数据存储篇 | MySQL(08) 分库与分表设计

随机推荐

  1. Android 弹出对话框Dialog
  2. appt命令检测Apk信息的方法
  3. 安卓中的布局属性详解
  4. Android应用程序的安装位置
  5. Android Studio 创建虚拟机失败 Failed t
  6. react-native-vector-icons(android)的安装
  7. Android(安卓)Transition(Android过渡动画
  8. Android中为窗口定义主题
  9. Android 笔记一:线性布局
  10. android读取功能