PHP反序列化

本文介绍了PHP中的对象序列化和反序列化的概念及作用,包括如何使用serialize()和unserialize()函数来转换对象为字符串并在内存中恢复。还探讨了魔术方法如__construct和__destruct,以及在反序列化过程中的安全风险,特别是unserialize函数可能引发的漏洞。同时提到了PHP 7.4.0中__serialize()和__unserialize()的新增功能。最后,文章中提到的一个错误提示和解决方案,即在php.ini中配置extension_dir来解决PHP扩展加载失败的问题。
摘要由CSDN通过智能技术生成

基础

  1. php类与对象
    类class:一个共享相同结构和行为的对象的合集
<?php
class XXX{
  var $var1;
  var $var2="string";
  function fuc($arg1,$arg2){
     ..函数体..
  }
  ...
}

对象Object
类的实例,

$中华田园犬= new 犬类;
$kitty = new Cat;

他们两者的关系,就相当于犬类和中华田园犬的关系。

  1. Magic函数
    Magic Methods(魔术方法):一种特殊的方法,当对 对象执行某些操作时会覆盖php的默认操作。
    __construct :当一个对象创建时被调用
    __destruct :当一个对象销毁时被调用
    __toString :当一个对象被当作一个字符串使用
    __sleep :在对象被序列化之前运行
    __wakeup :在对象被反序列化之后被调用
    __serialize() :对对象调用serialize()方法,PHP 7.4.0 起
    __unserialize() :对对象调用unserialize()方法,PHP 7.4.0 起
    __call() :在对象上下文中调用不可访问的方法时触发
    __callStatic() :在静态上下文中调用不可访问的方法时触发
    __get() :用于从不可访问的属性读取数据
    __set() :用于将数据写入不可访问的属性
    __isset() :在不可访问的属性上调用isset()或empty()触发
    __unset() :在不可访问的属性上使用unset()时触发
    __invoke() :当脚本尝试将对象调用为函数时触发
    在这里插入图片描述magic函数的使用,方便了对象的创建、销毁等去统一控制。相当于预埋了一个控制点。

序列化与反序列化

  • 作用:传输对象,用作缓存(cookie,session)。

  • PHP的对象,存活时存放在内存中,这时可以访问它的属性,调用方法,一旦代码运行完毕,对象消亡就访问不到了,若有需求要访问这个对象,在另一个class中调用就无法做到,那若以某种形式存储并恢复到内存中就可以访问,也可以传到其他地方用,这种把对象转化为字符的形式称为序列化,反之 反序列化。在这里插入图片描述

  • serialize() :序列化,产生一个可存储的值的表示,下图中展示了序列化后的格式。基本上格式:“变量类型:[个数(字符串等才有)]:变量值;”在这里插入图片描述
    其他的序列化格式:
    json字符串、xml字符串格式、二进制格式、字节数组。
    如果不想一些数据被序列化,用__sleep()重写,将要返回的用数组写到__sleep中。
    unserialize():反序列化。在这里插入图片描述注意哦,在反序列化中,我们是可以将一些参数改变的。在php7.4.0版本中,如果类中同时定义了__unserialize()和__wakeup()两个魔术方法,只有__unserialize()方法生效,__wakeup()方法会被忽略。

  • 漏洞

    1. unserialize函数的参数可控,如通过get请求传参。
    2. 脚本中定义了magic方法,且方法中向php文件做读写数据或者执行命令的操作,如_destruct()、 unlink().
    3. 操作内容需要有对象中的成员变量的值,如filename。

我在使用phpstorm时报错:PHP Warning: PHP Startup: Unable to load dynamic library ‘mysqli’ (tried: C:\php\ext\mysqli (找不到指定的模块。), C:\php\ext\php_mysqli.dll (找不到指定的模块。)) in Unknown on line 0
解决在安装PHP的文件路径中找到php.ini,把extension_dir = “D:\WEB\PHP\ext” 取消注释,就可以解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值