Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >PHP中对象的序列化和反序列化

PHP中对象的序列化和反序列化

作者头像
宣言言言
发布于 2019-12-18 08:41:07
发布于 2019-12-18 08:41:07
1.4K00
代码可运行
举报
文章被收录于专栏:宣言(Siam)博客宣言(Siam)博客
运行总次数:0
代码可运行

php的serialize函数和unserialize函数

serialize() 返回字符串,可以存储于任何地方。

serialize() 可处理除了 resource 之外的任何类型。甚至可以 serialize() 那些包含了指向其自身引用的数组。

这有利于存储或传递 PHP 的值,同时不丢失其类型和结构

在需要恢复的地方使用unserialize()函数即可

php类魔术方法中的__sleep和__wakeup

在众多的php类魔术方法中(另一篇文章有简单介绍 PHP类,魔术方法),有两个是跟序列化有关的。

__sleep() 在对象被调用serialize时隐式唤起,可以返回需要参与序列化的属性数组 __wakeup() 当调用unserialize恢复对象的时候,会被隐式唤起,可以做一些初始化工作

简单实战

假设,我们在cli模式的php程序,会根据调用命令解析到不同的类执行。

该类拥有以下3个属性,其中isDev,isCli应该根据运行入口、配置文件等状态而决定。

所以当我们在序列化该类的对象时,不应该包含这两个属性,而应该在wakeup的时候,动态取配置文件的值然后设置进去。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Command{
    public $name;  // 命令名
    public $isDev; // 是否为开发环境
    public $isCli; // 是否为命令行运行

    public function run()
    {
        if ($this->isDev){
            echo "debug\n";
        }
        if (!$this->cli){
            echo "only cli\n";
        }
    }

    // 设置规定参与序列化的属性
    public function __sleep()
    {
        return ['name'];    
    }

    public function __wakeup()
    {
        // 从配置文件读取
        $config = file_get_content("siam.conf");
        $this->isDev = $config['dev'] ?? true;
        // 运行环境判断
        $this->isCli = true;
    }
}

实例化对象 并序列化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$class = new Command();
$class->isDev = true;
$class->isCli = true;
$str =  serialize($class);

var_dump(unserialize($str));
// 得到以下对象,isDev不会序列化原始的对象属性,而是通过wakeup重新定义
// object(Command)#3 (3) { ["name"]=> NULL ["isDev"]=> bool(false) ["isCli"]=> bool(true) }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.08.12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP的反序列化和POP链利用
POP面向属性编程,常用于上层语言构造特定调用链的方法,与二进制利用中的面向返回编程(Return-Oriented Programing)的原理相似,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构成一组连续的调用链,最终达到攻击者邪恶的目的。类似于PWN中的ROP,有时候反序列化一个对象时,由它调用的__wakeup()中又去调用了其他的对象,由此可以溯源而上,利用一次次的“gadget”找到漏洞点。
Andromeda
2023/10/21
1.1K0
PHP的反序列化和POP链利用
web安全 -- php反序列化漏洞
序列化是将对象转换为字节流,在序列化期间,对象将当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象状态,重新创建该对象,序列化的目的是便于对象在内存、文件、数据库或者网络之间传递。
Gh0st1nTheShel
2022/01/24
8670
初探序列化与反序列化
在写程序尤其是写网站的时候,经常会构造类,并且有时候会将实例化的类作为变量进行传输。
偏有宸机
2020/11/04
8200
初探序列化与反序列化
CTF竞赛 | PHP反序列化基础
通过序列化与反序列化我们可以很方便的在PHP中传递对象,下面小编给大家介绍反序列化的原理和一些常见的利用方式。
安全小王子
2021/02/24
1.3K0
CTF竞赛 | PHP反序列化基础
反序列化漏洞理论实战详解
反序列化漏洞是基于序列化和反序列化的操作,在反序列化——unserialize()时存在用户可控参数,而反序列化会自动调用一些魔术方法,如果魔术方法内存在一些敏感操作例如eval()函数,而且参数是通过反序列化产生的,那么用户就可以通过改变参数来执行敏感操作,这就是反序列化漏洞。
litbaizhang
2021/03/11
2.9K1
反序列化漏洞理论实战详解
php反序列化漏洞
类的概念:类是具有相同属性和操作的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述, 其内部包括属性和操作两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位, 它应该有一个类名并包括属性说明和操作说明两个主要部分。 简单点说类就是某一物件的模型 类的关键字 class 示例
宸寰客
2020/09/01
7580
php反序列化漏洞
几种反序列化漏洞
xxe.xml 和 xxe.dtd 构造见我的 XXE 文章,XXE XML外部实体注入(https://www.cnblogs.com/Night-Tac/articles/16931091.html)
红队蓝军
2023/09/13
4840
PHP反序列化漏洞
序列化就是将一个对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名。
用户2700375
2022/06/09
5110
PHP反序列化漏洞
经验分享 | PHP-反序列化(超细的)
ps:很多小伙伴都催更了,先跟朋友们道个歉,摸鱼太久了,哈哈哈,今天就整理一下大家遇到比较多的php反序列化,经常在ctf中看到,还有就是审计的时候也会需要,这里我就细讲一下,我建议大家自己复制源码去搭建运行,只有自己去好好理解,好好利用了才更好的把握,才能更快的找出pop链子,首先呢反序列化最重要的就是那些常见的魔法函数,很多小伙伴都不知道这个魔法函数是干啥的,今天我就一个一个,细致的讲讲一些常见的魔法函数,以及最后拿一些ctf题举例,刚开始需要耐心的看,谢谢大家的关注,我会更努力的。
F12sec
2022/09/29
2.3K0
经验分享 | PHP-反序列化(超细的)
PHP反序列化
```php foo=”data”; echo ‘foo’; //单引号会输出foo echo “foo”; //双引号会转义,输出data
h3110_w0r1d
2024/02/19
2040
PHP反序列化
PHP反序列化漏洞
这里你可以看到, 我代码里的类定义为: class F, 这个序列化就是 F, 我定义变量名字是filename, 它这里也是 filename, 我们可以修改看看:
伍尚国
2018/09/11
6100
PHP反序列化漏洞
DASCTF-Esunserialize(反序列化字符逃逸)
做这个题的时候我也第一次接触字符逃逸。似乎明白了怎么利用。顺便通过这个题了解反序列化的字符逃逸。
Gamma实验室
2020/12/23
1.1K0
DASCTF-Esunserialize(反序列化字符逃逸)
深入浅出反序列化漏洞
阅读本文前应该先去了解,什么是类,什么是对象,推荐搜索关键词,php对象和类,java对象和类
鱼丸
2022/04/28
4480
php反序列化漏洞简单总结
​ 这其实是为了解决 PHP 对象传递的一个问题,因为 PHP 文件在执行结束以后就会将对象销毁,那么如果下次有一个页面恰好要用到刚刚销毁的对象就会束手无策,总不能你永远不让它销毁,等着你吧,于是人们就想出了一种能长久保存对象的方法,这就是 PHP 的序列化,那当我们下次要用的时候只要反序列化一下就 ok 啦。
pankas
2022/08/10
7660
php反序列化漏洞简单总结
CTFshow之web入门反序列化
PHP反序列化实际上已经开始是Web安全的进阶操作了,虽然在这个时代Web选手上分极其困难,PHP反序列化已经成为了基础…..
十二惊惶
2024/02/28
3740
从CTF中学习PHP反序列化的各种利用方式
为了方便数据存储,php通常会将数组等数据转换为序列化形式存储,那么什么是序列化呢?序列化其实就是将数据转化成一种可逆的数据结构,自然,逆向的过程就叫做反序列化。
Ms08067安全实验室
2022/09/26
3.4K0
PHP反序列化漏洞
魔术方法是PHP面向对象中特有的特性。它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,利用模式方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法)
Andromeda
2022/10/27
1K0
PHP反序列化漏洞
CVE-2016-7124反序列化漏洞
CDN即内容分发网络,主要是解决访问网站速度,比如说,某个网站的主机是在黑龙江的,现在有人要在广东访问,没有CDN加速的话,肯定是慢的,CDN的作用就是将该网站的静态资源先放在各地的CDN主机上,如果有人需要访问,就会就近原则,访问cdn主机上的静态资源,这样子,访问的速度,就有了大大的提升
vFREE
2021/12/20
1.2K0
CVE-2016-7124反序列化漏洞
PHP反序列化漏洞说明
PHP程序为了保存和转储对象,提供了序列化的方法,序列化是为了在程序运行的过程中对对象进行转储而产生的。
Ms08067安全实验室
2020/01/02
7770
CTF笔记-1-PHP序列化与反序列化(__sleep与__wakeup)
__sleep 与 __wakeup 序列化: 将一个对象转化成字符串 反序列化:将一个字符串转换成对象
Baige
2022/03/22
1.2K0
CTF笔记-1-PHP序列化与反序列化(__sleep与__wakeup)
相关推荐
PHP的反序列化和POP链利用
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文