序列化和反序列化

先来看一段后端php代码:

<?php

class user {   

    public $name;

    public $age;

    public $password;

    public function __wakeup(){

        system($this->name);

    }

}

$obj = new user();

$obj->name = "calc";

$obj->age = 25;

$obj->password = "123456";

$ser = serialize($obj);

echo "序列化结果:";

var_dump($ser);

echo "<br>";

echo "反序列化结果:";

$unser = unserialize($ser);

var_dump($unser);

?>

代码解析

该代码演示了PHP中类的定义、对象序列化与反序列化过程,以及魔术方法__wakeup()的触发机制。

类定义与成员变量

定义了一个名为user的类,包含三个公共成员变量:

  • $name:存储用户名
  • $age:存储年龄
  • $password:存储密码

魔术方法 __wakeup()

public function __wakeup(){
    system($this->name);
}

当对象被反序列化时自动调用该方法,其中system()函数会执行$this->name指定的系统命令(示例中为calc,将打开Windows计算器)。

对象创建与赋值

$obj = new user();
$obj->name = "calc";
$obj->age = 25;
$obj->password = "123456";

创建user类实例并设置属性值。

序列化过程

$ser = serialize($obj);
var_dump($ser);

输出类似:

string(84) "O:4:"user":3:{s:4:"name";s:4:"calc";s:3:"age";i:25;s:8:"password";s:6:"123456";}"

反序列化与漏洞

$unser = unserialize($ser);

反序列化时会自动触发__wakeup(),导致system("calc")被执行。这种机制可能被恶意利用执行任意系统命令(如替换calcrm -rf /等危险命令)。

安全建议

  1. 避免在__wakeup()中执行敏感操作
  2. 对反序列化数据来源进行严格校验
  3. 使用__wakeup()时避免直接调用系统函数
  4. 考虑使用json_encode()/json_decode()替代序列化

该示例展示了反序列化漏洞的典型场景,实际开发中需特别注意此类安全隐患。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值