php中session反序列化机制
在php.ini中存在三项配置项
1 | session.save_path="" --设置session的存储路径 |
以上基本就是与php的session存储以及序列化相关的配置选项。
如果是用xmapp进行搭建环境的话,上述的配置大致如下:
1 | session.save_path="D:\xampp\tmp" 表明所有的session文件都是存储在xampp/tmp下 |
session.serialize_handler=php 对于该配置,是用来指定session的序列化引擎,除了默认引擎,还存在其他引擎,不同引擎对应存储方式不同。
- php_binary:存储方式是,键名的长度对应的ASCII字符+键名+经过serialize()函数序列化处理的值
- php:存储方式是,键名+竖线+经过serialize()函数序列处理的值
- php_serialize(php>5.5.4):存储方式是,经过serialize()函数序列化处理的值
当我设置session为$_SESSION["name"] = "123";
时。不同的引擎保存的session文件内容如下
1 | php: |
如果要修改为其他引擎,只需要添加代码:
ini_set(‘session.serialize_handler’, ‘需要设置的引擎’);
sample:
1 | <?php |
另外因为这里例子设定是session以文件格式存储(默认以文件形式存储),存储的文件以sess_sessionid来进行命名,文件的内容就是session值序列化之后的内容。
依旧假设为xmapp配置环境,默认设置下
1 | <?php |
这里phpsessid的值为jo86ud4jfvu81mbg28sl2s56c2,而在xampp/tmp
下存储的文件名是sess_jo86ud4jfvu81mbg28sl2s56c2
,文件的内容是name|s:4:"test";
。name是键值,s:4:"test";
是serialize("test")
的结果。
在php_serialize引擎下:
1 | <?php |
SESSION文件的内容是a:1:{s:4:"name";s:4:"test";}
。a:1
是使用php_serialize进行序列话都会加上。同时使用php_serialize会将session中的key和value都会进行序列化
在php_binary引擎下
1 | <?php |
SESSION文件的内容是names:4:"test";
。由于name
的长度是4,4在ASCII表中对应的就是EOT
。根据php_binary的存储规则,最后就是names:4:"spoock";
这里出现不可见字符,是因为ascii值为4的字符无法在网页上显示