PHP反序列化漏洞之反序列化概念

1、反序列化的概念

        1、session传参

        2、反序列化时对应类的作用

        3、反序列和类中属性的值的关系

将序列化后的字符串转换回对象或者数组。

在PHP中使用unserialize()函数来将序列化后的字符串转换回PHP的值,并返回的值可为 integer、float、string、array 或 object类型。

我们下面的例子把序列化的结果写入一个文本中存储 :

<?php
class test{
    public $a = 'dasuan';
    protected $b = 666;
    private  $c = false;
    public function displayVar() {
        echo $this->a;
    }
}
$a = new test();
$b =serialize($a);
print_r($b);            // 输出序列化后的字符串
echo PHP_EOL;
echo PHP_EOL;
echo urlencode($b);           //输出url编码后的字符串
?>

输出结果为:

序列化:"O:4:"test":3:{s:1:"a";s:6:"dasuan";s:4:" * b";i:666;s:7:" test c";b:0;}"


url编码后的:O%3A4%3A%22test%22%3A3%3A%7Bs%3A1%3A%22a%22%3Bs%3A6%3A%22dasuan%22%3Bs%3A4%3A%22%00%2A%00b%22%3Bi%3A666%3Bs%3A7%3A%22%00test%00c%22%3Bb%3A0%3B%7D

我们重新写一个文件,读取刚才存储的文本内容并对内容进行反序列化:

<?php

$d = 'O%3A4%3A%22test%22%3A3%3A%7Bs%3A1%3A%22a%22%3Bs%3A6%3A%22dasuan%22%3Bs%3A4%3A%22%00%2A%00b%22%3Bi%3A666%3Bs%3A7%3A%22%00test%00c%22%3Bb%3A0%3B%7D';
$b = urldecode($d);
$a = unserialize($b);
print_r($a);
?>

输出:

__PHP_Incomplete_Class Object
(
    [__PHP_Incomplete_Class_Name] => test
    [a] => dasuan
    [b:protected] => 666
    [c:test:private] => 
)

为什么要序列化对象成字符串呢?在开发中又起到什么作用?

序列化作用:方便传输、方便存储。

因为PHP文件执行后会把内存的数据进行销毁,如果下一个文件想用到刚刚销毁对象的属性和值就还要重新实例化new一次对象,所以才会将对象进行序列化然后存储,也避免重新实例化带来的耗费。开发中比较好举例就是session,PHP中如果使用php_serialize引擎,那么存储session文件将以序列化的方式存储在文件中,当我们要验证当前用户是否有权限进入该页面时就需要反序列化读取存储在服务器上面的session文件的值来判断。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值