php未定义的变量name_PHP--序列化与反序列化详解

PHP--序列化与反序列化详解

博客说明

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!

说明

学到网络安全的时候用到了序列化和反序列化的操作,感觉挺有用的,首先给出文档地址https://www.php.net/manual/zh/language.oop5.serialization.php

所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

为了能够unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。 如果要想在另外一个文件中解序列化一个对象,这个对象的类必须在解序列化之前定义,可以通过包含一个定义该类的文件或使用函数spl_autoload_register()来实现。

PHP序列化:serialize

序列化是将变量或对象转换成字符串的过程。

<?php

class student{
    public $name;
     public $age;
     public $number;

     //_construct:创建对象时初始化
     function __construct($name,$age,$number){        
          $this->name = $name;
          $this->age = $age;
          $this->number = $number;
     }
}

$student = new student("Jack",22,11086);
var_dump(serialize($student));

?>
测试运行

undefined_b.jpg
string(76) "O:7:"student":3:{s:4:"name";s:4:"Jack";s:3:"age";i:22;s:6:"number";i:11086;}"
PHP反序列化:unserialize

反序列化是将字符串转换成变量或对象的过程。

<?php

class student{
    public $name;
     public $age;
     public $number;

     //_construct:创建对象时初始化
     function __construct($name,$age,$number){        
          $this->name = $name;
          $this->age = $age;
          $this->number = $number;
     }
}

$student = 'O:7:"student":3:{s:4:"name";s:4:"Jack";s:3:"age";i:22;s:6:"number";i:11086;}';
var_dump(unserialize($student));

?>
测试运行

11a651401e2ca5b213f403f565fe42fa.png
object(student)#1 (3) {
  ["name"]=>
  string(4) "Jack"
  ["age"]=>
  int(22)
  ["number"]=>
  int(11086)
}
魔术函数
函数 说明 __construct() 类的构造函数 __destruct() 类的析构函数 __call() 在对象中调用一个不可访问方法时调用 __callStatic() 用静态方式中调用一个不可访问方法时调用 __get() 获得一个类的成员变量时调用 __set() 设置一个类的成员变量时调用 __isset() 当对不可访问属性调用isset()或empty()时调用 __unset() 当对不可访问属性调用unset()时被调用 __sleep() 执行serialize()时,先会调用这个函数 __wakeup() 执行unserialize()时,先会调用这个函数 __toString() 类被当成字符串时的回应方法 __invoke() 调用函数的方式调用一个对象时的回应方法 __set_state() 调用var_export()导出类时,此静态方法会被调用 __clone 当对象复制完成时调用 __autoload() 尝试加载未定义的类 __debugInfo() 打印所需调试信息

为什么突然说到魔术函数呢,因为在序列化和反序列化的时候经常会用到__construct()__destruct()__sleep()__wakeup()

在后面的博客里面有相应的ctf实例

感谢

万能的网络

以及勤劳的自己

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值