php中session反序列化机制

在php.ini中存在三项配置项

1
2
3
4
session.save_path=""   --设置session的存储路径
session.save_handler="" --设定用户怎样存储session
session.auto_start --指定是否自动启动session,默认为0不启动
session.serialize_handler 用来指定序列化/反序列化的处理器名字。默认使用php

以上基本就是与php的session存储以及序列化相关的配置选项。
如果是用xmapp进行搭建环境的话,上述的配置大致如下:

1
2
3
4
session.save_path="D:\xampp\tmp"	表明所有的session文件都是存储在xampp/tmp下
session.save_handler=files 表明session是以文件的方式来进行存储的
session.auto_start=0 表明默认不启动session
session.serialize_handler=php 表明session的默认序列化引擎使用的是php序列化引擎

session.serialize_handler=php 对于该配置,是用来指定session的序列化引擎,除了默认引擎,还存在其他引擎,不同引擎对应存储方式不同。

  • php_binary:存储方式是,键名的长度对应的ASCII字符+键名+经过serialize()函数序列化处理的值
  • php:存储方式是,键名+竖线+经过serialize()函数序列处理的值
  • php_serialize(php>5.5.4):存储方式是,经过serialize()函数序列化处理的值
    当我设置session为$_SESSION["name"] = "123";时。不同的引擎保存的session文件内容如下
1
2
3
4
5
6
7
8
9
10
11
php: 
name|s:3:"123";
存储方式是,键名的长度对应的ASCII字符+键名+经过serialize()函数序列化处理的值

php_binary:
names:3:"123";
存储方式是,键名+竖线+经过serialize()函数序列处理的值

php_serialize(php>5.5.4):
a:1:{s:4:"name";s:3:"123";}
存储方式是,经过serialize()函数序列化处理的值

如果要修改为其他引擎,只需要添加代码:
ini_set(‘session.serialize_handler’, ‘需要设置的引擎’);

sample:

1
2
3
<?php
ini_set('session.serialize_handler', 'php_serialize');
session_start();

另外因为这里例子设定是session以文件格式存储(默认以文件形式存储),存储的文件以sess_sessionid来进行命名,文件的内容就是session值序列化之后的内容。
依旧假设为xmapp配置环境,默认设置下

1
2
3
4
5
<?php
session_start()
$_SESSION['name'] = 'test';
var_dump();
?>

图片

这里phpsessid的值为jo86ud4jfvu81mbg28sl2s56c2,而在xampp/tmp下存储的文件名是sess_jo86ud4jfvu81mbg28sl2s56c2,文件的内容是name|s:4:"test";。name是键值,s:4:"test";serialize("test")的结果。

在php_serialize引擎下:

1
2
3
4
5
6
<?php
ini_set('session.serialize_handler', 'php_serialize');
session_start();
$_SESSION['name'] = 'test';
var_dump();
?>

SESSION文件的内容是a:1:{s:4:"name";s:4:"test";}a:1是使用php_serialize进行序列话都会加上。同时使用php_serialize会将session中的key和value都会进行序列化
在php_binary引擎下

1
2
3
4
5
6
<?php
ini_set('session.serialize_handler', 'php_binary');
session_start();
$_SESSION['name'] = 'test';
var_dump();
?>

SESSION文件的内容是names:4:"test";。由于name的长度是4,4在ASCII表中对应的就是EOT。根据php_binary的存储规则,最后就是names:4:"spoock"; 这里出现不可见字符,是因为ascii值为4的字符无法在网页上显示