首页 > 编程语言 >零基础入门——从零开始学习PHP反序列化笔记(二)

零基础入门——从零开始学习PHP反序列化笔记(二)

时间:2023-07-18 16:35:53浏览次数:32  
标签:__ 触发 PHP 调用 从零开始 serialize 时机 序列化

魔术方法

魔术方法介绍

__construct()

触发时机:实例化对象之前

构造函数,在实例化一个对象的时候,首先会去自动执行的一个方法;

<?php
class User {
    public $username;
    public function __construct($username) {
        $this->username = $username;
        echo "触发了构造函数1次" ;
    }
}
$test = new User("benben");
$ser = serialize($test);
unserialize($ser);

?>

__destruct()

触发时机:实例化对象结束后执行 反序列化过程中触发

析构函数,在对象的所有引用被删除或者当对象被显式销毁时执行的魔术方法。

<?php
highlight_file(__FILE__);
class User {
    public function __destruct()
    {
        echo "触发了析构函数1次"."<br />" ;
    }
}
$test = new User("benben");
$ser = serialize($test);
unserialize($ser);
?>

__sleep()

触发时机:序列化serialize之前

序列化serialize()函数会检查类中是否存在一个魔术方法__sleep().
如果存在,该方法会先被调用,然后才执行序列化操作。
此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。
如果该方法未返回任何内容,则NULL被序列化,并产生一个E_NOTICE级别的错误。

image-20230430155606920echo serialize($user);?>N;

<?php
class User {
    const SITE = 'uusama';
    public $username;
    public $nickname;
    private $password;
    public function __construct($username, $nickname, $password)    {
        $this->username = $username;
        $this->nickname = $nickname;
        $this->password = $password;
    }
    public function __sleep() {
        return array('username', 'nickname');
    }
}
$user = new User('a', 'b', 'c');
echo serialize($user);
?>

可以看到 调用sleep()方法之后 password并没有被回显

例题

payload

http://192.168.20.158:8000/class08/2.php?benben='id'

__wakeup()

触发时机:反序列化unserialize之前

例题

payload

http://192.168.20.158:8000/class08/4.php?benben=O:4:"User":1:{s:8:"username";s:2:"id";}

__tostring()

触发时机:把对象被当做字符串调用

代码示例

__invoke()

触发时机:把对象当做函数调用

代码示例

__call()

触发时机:调用一个不存在的方法

__callStatic()

触发时机:静态调用或调用成员常量时使用的方法不存在

__get()

触发时机:调用的成员属性不存在

__set()

触发时机:给不存在的成员属性赋值

__isset()

触发时机:对不可访问属性使用isset()或empty()时,__isset()会被调用

__unset()

触发时机:对不可访问属性使用unset()时被调用

__clone()

触发时机:当使用clone关键字拷贝完成一个对象后,新对象会自动调用定义的魔术方法_clone()

触发时机归纳

标签:__,触发,PHP,调用,从零开始,serialize,时机,序列化
From: https://www.cnblogs.com/Tzyyyyy/p/17563342.html

相关文章

  • PHP浮点数运算的问题
    $a=0.1;$b=0.7;$c=0.5;$d=0.9;if($a+$b==0.8){echo'==';}else{echo'!=';}//!=if($a+$c==0.6){echo'==';}else{echo'!=';}//==if($a+$d==1){echo'==';}else{echo'!=';......
  • PHP实现冒泡排序
    冒泡排序的原理:1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3.针对所有的元素重复以上的步骤,除了最后一个。4.持续每次对越来越少的元素重复上面的步骤,直到没有......
  • 新手学php之字符串变量表述与运算
    ​<?php$txt="Hello world!";echo $txt;?>PHP中的字符串变量字符串变量用于包含有字符的值。在创建字符串之后,我们就可以对它进行操作了。您可以直接在函数中使用字符串,或者把它存储在变量中。在下面的实例中,我们创建一个名为txt的字符串变量,并赋值为"Helloworld!"......
  • php实现站群软件权限管理功能示例
    1.管理员页面RBAC.php<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>权限管理</title><scriptsrc="bootstrap/js/jquery-1.11.2.min.js"></script></head><body>......
  • php位运算实现网站权限管理的方法
    ​首先我们先定义4个常量来设定四种权限:=====================================define(ADD,1);//增加数据库记录的权限define(UPD,2);//修改数据库记录的权限define(SEL,4);//查找数据库记录的权限define(DEL,8);//删除数据库记录的权限==================================......
  • php做网页版剪刀石头布的功能
    实例讲述了php实现的网页版剪刀石头布攻略在玩游网上的设计。分享给大家供大家参考,具体如下:<?php/**Createdon2016-11-25**/if(isset($_POST['sub'])){$what=$_POST['what'];//需要输入的数组$my_array=array("剪刀","石头","布");//获胜规则$guize=a......
  • redisson实现序列化的方法
    引用:https://www.fengnayun.com/news/content/102781.html这篇文章运用简单易懂的例子给大家介绍redisson实现序列化的方法,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Redisson是架设在Redis基础上的一个Java驻内存数据网格(In-MemoryDataGrid)。Redis......
  • Fastjson反序列化
    Fastjson反序列化漏洞fastjson是阿里巴巴公司推出的一个用于快速处理json数据的java类库,这个库由于在传输json数据的时候,中间有一个标识,这个标识允许用户传入一个类名,因此攻击者可以传入他想要执行的类,通过执行这个类,调用rmi方法,去执行他部署的一个恶意方法json一种特殊的数据......
  • phpstudy部署简易的网站
     网站的起源 web1.0 纯静态网站 展示的数据就是网站源码中的数据 不能够具备利用攻击手段获得数据,但是可以拒绝式服务攻击 web2.0 动态网站 有数据库,网站数据放置在数据库中 具备攻击 获取数据 网站使用的协议 协议 http 超文本传输协议 ......
  • 【补充】Django自带的序列化组件
    【11.0补充】Django自带的序列化组件【一】准备数据fromdjango.dbimportmodels#Createyourmodelshere.classUser(models.Model):username=models.CharField(max_length=32,verbose_name="姓名")age=models.IntegerField(verbose_name="年龄")g......