当前位置: 首页 > wzjs >正文

导购网站怎么推广安卓软件开发app

导购网站怎么推广,安卓软件开发app,网站建好后维护麻烦吗,tp网站建设开源代码PHP反序列化原理详解 引言 PHP反序列化是PHP中一个重要的概念,它允许将序列化后的数据重新转换为原始的数据结构。在PHP中,可以使用serialize()函数将数据序列化为字符串,然后使用unserialize()函数将序列化后的字符串反序列化为原来的数据结…

PHP反序列化原理详解

引言

  PHP反序列化是PHP中一个重要的概念,它允许将序列化后的数据重新转换为原始的数据结构。在PHP中,可以使用serialize()函数将数据序列化为字符串,然后使用unserialize()函数将序列化后的字符串反序列化为原来的数据结构。这个过程在数据存储、传输和对象持久化等方面起着关键作用。然而,不当使用反序列化可能导致安全漏洞,因此理解其原理和正确使用方法至关重要。

原理

  1. 序列化: PHP中的serialize()函数用于将数据(如数组、对象)转换为字符串格式,以便存储或传输。序列化后的字符串包含数据类型和值的信息。
  2. 反序列化: unserialize()函数用于将序列化后的字符串转换回PHP值,如数组或对象。在反序列化过程中,PHP根据序列化字符串中的信息重新构建原始数据结构。

PHP序列化原理演示

序列化

<?php
class Test {// 声明属性public $publicVar = "public value";private $privateVar = "private value";protected $protected = "protected value";// 声明方法public function printVar() {echo $this->publicVar . "\n";echo $this->privateVar . "\n";echo $this->protected . "\n";}
}$test = new Test();
$test->printVar();$testSerial = serialize($test);
echo $testSerial;

当一个方法在类定义内部被调用时,有一个可用的伪变量 t h i s 。 this。 thisthis 是一个到当前对象的引用。

运行结果

public value
private value
protected value
O:4:"Test":3:{s:9:"publicVar";s:12:"public value";s:16:"TestprivateVar";s:13:"private value";s:12:"*protected";s:15:"protected value";}

将序列化之后的值格式化来分析

O:4:"Test":3:{s:9:"publicVar";s:12:"public value";s:16:"TestprivateVar";s:13:"private value";s:12:"*protected";s:15:"protected value";
}
  • O:4:"Test":3:{:这表示一个对象(O),其类名长度为4("Test"),并且有3个属性。
    • 第一个属性:
      • s:9:"publicVar";:这是一个字符串(s),长度为9,内容为 "publicVar",表示属性名。
      • s:12:"public value";:这是一个字符串,长度为12,内容为 "public value",表示公共属性的值。
    • 第二个属性:
      • s:16:"TestprivateVar";:这是一个字符串,长度为16,内容为 "TestprivateVar",表示私有属性的名称。在PHP中,私有属性在序列化时会以类名作为前缀。
      • s:13:"private value";:这是一个字符串,长度为13,内容为 "private value",表示私有属性的值。
    • 第三个属性:
      • s:12:"*protected";:这是一个字符串,长度为12,内容为 "*protected",表示受保护属性的名称。在PHP中,受保护属性在序列化时会以星号(*)作为前缀。
      • s:15:"protected value";:这是一个字符串,长度为15,内容为 "protected value",表示受保护属性的值。

公共属性很好理解,但私有属性和保护属性就不一样了

protected:受保护成员只能在其定义的类及其子类中访问。

​ 序列化后属性名 \x00\*\x00属性名

**private:**私有成员只能在其定义的类内部访问,不能在子类或类外部访问。

​ 序列化后属性名 \x00类名\x00属性名

注意:浏览器输出默认不显示\x00

PHP序列化字符串中使用的类型标识符及其对应的数据类型

类型标识符数据类型描述
s字符串(String)表示一个字符串,例如 s:5:"hello"
i整数(Integer)表示一个整数,例如 i:123
d浮点数(Double)表示一个浮点数,例如 d:3.14
b布尔值(Boolean)表示一个布尔值,b:1 表示 true,b:0 表示 false。
a数组(Array)表示一个数组,例如 a:2:{i:0;s:5:"apple";i:1;s:6:"banana"}
O对象(Object)表示一个对象,例如 O:6:"MyClass":1:{s:3:"foo";s:5:"bar"}
NNULL值表示 NULL 值,例如 N;
r引用(Reference)表示指向当前对象中的引用,例如 r:2;
R引用(Reference)表示指向序列化数据中另一个对象的引用,例如 R:3;
C自定义序列化(Custom serialization)表示自定义序列化的对象,例如 C:6:"MyClass":0:{}

魔术方法

魔术方法是一种特殊的方法,当对对象执行某些操作时会覆盖 PHP 的默认操作。

魔术方法功能描述
__construct()构造方法,在对象创建时自动调用。
__destruct()析构方法,在对象被销毁前自动调用。
__call()在调用不可访问的方法时自动调用。
__callStatic()在静态上下文中调用不可访问的方法时自动调用。
__get()在读取不可访问的属性时自动调用。
__set()在设置不可访问的属性时自动调用。
__isset()在使用isset()empty()检测不可访问的属性时自动调用。
__unset()在使用unset()销毁不可访问的属性时自动调用。
__sleep()在序列化对象之前自动调用,用于清理对象或返回一个包含要序列化的属性名的数组。
__wakeup()在反序列化对象之后自动调用,用于重建对象。
__serialize()自定义序列化逻辑,返回一个数组,包含要序列化的属性和值。PHP 7.4+
__unserialize()自定义反序列化逻辑,接收一个数组,包含序列化的属性和值。PHP 7.4+
__toString()在尝试将对象转换为字符串时自动调用。返回对象的字符串表示。
__invoke()当尝试将对象作为函数调用时自动调用。
__set_state()在使用var_export()导出类时,此静态方法会被调用,用于恢复类的属性。
__clone()在对象被复制时自动调用,用于自定义克隆逻辑。
__debugInfo()在使用var_dump()打印对象时自动调用,用于提供调试信息。PHP 5.6+
<?php
class Test {// 声明属性public $publicVar = "public value";private $privateVar = "private value";protected $protected = "protected value";// 声明方法public function printVar() {echo $this->publicVar . "\n";echo $this->privateVar . "\n";echo $this->protected . "\n";}public function __wakeup() {echo '__wakeup';}
}$test = new Test();
$test->printVar();$testSerial = serialize($test);
echo $testSerial;
echo "\n";
unserialize($testSerial);

可以看到运行最后调用了 __wakeup 魔术方法

public value
private value
protected value
O:4:"Test":3:{s:9:"publicVar";s:12:"public value";s:16:" Test privateVar";s:13:"private value";s:12:" * protected";s:15:"protected value";}
__wakeup

如果__wakeup方法中有高敏感度代码,例如命令执行等,可能会导致意外的风险

例如:

<?php
class Test {public $cmd = '';public function __wakeup() {system($this->cmd);}
}unserialize($_GET['data']);

传入?data=O:4:"Test":1:{s:3:"cmd";s:2:"id";}即可成功返回命令执行结果

http://www.dtcms.com/wzjs/828771.html

相关文章:

  • 网站开发公司会计科目在线妇科免费咨询
  • 企业网站开发需求分析wordpress阅读数总是0
  • 苏州专业网站建设设计公司排名域名查询平台
  • 如何做好一个购物网站崇义做网站
  • 企业建站项目开发公司办公电脑申请怎么写
  • 免费开设网站湘潭网站建设优选磐石网络
  • 唐尧文化 网站建设工作总结商城网站建设解决方案
  • 百度商桥怎么和网站推广app的单子都在哪里接的
  • 老年夫妻做爰视频网站做vi的网站
  • 网站篡改搜索引擎js湖北网站备案需要多久
  • 寻花问柳一家专门做男人的网站o2o与网站建设
  • 互联业务登录页 网站asp双语企业网站源码
  • 湖南网站制作公司推荐做冻品海鲜比较大的网站有哪些
  • 外国网站手机dns莱芜市为什么撤了
  • 网站首页制作教程wordpress 中文文档
  • 企业公众号以及网站建设个人网站设计论文下载
  • 南漳网站开发协会网站设计方案模板
  • 蝶山网站建设浙江人事考试网
  • 用discuz可以做视频网站吗中国做视频网站有哪些内容
  • 代码错误网站网站建设色调的
  • 网站公司 转型阿里巴巴装修网站
  • 旅游类网站建设方案太原网站设计排名
  • 网站首页设计多少钱教育机构网站模板
  • 个人网站导航模版设计联盟网站
  • 惠州做网站好的公司外贸建站哪个最便宜
  • 网站建设系统设计制作企业网站首页效果图
  • 木马科技网站建设小程序电商平台
  • 社区网站建设论文上海广告公司排行榜
  • 如何做盗版网站在网上做广告怎么做
  • 长沙县工程建设质监站网站网页设计与制作基础代码