美文网首页
php反序列化_2

php反序列化_2

作者: HOtMI1k | 来源:发表于2019-01-27 22:22 被阅读0次

    在1的基础上,我写了段代码来实验自己的理解。

    <?php
    
        class test
        {
            public $hello;
            function __construct()
            // function __destruct()
            {
                echo "fun".$this->hello;
                // eval($this->hello);
            }
        }
    
        // $a = new test();
        // $a->hello = "phpinfo();";
        // echo serialize($a);
        $b = 'O:4:"test":1:{s:5:"hello";s:10:"phpinfo();";}';
        $c = unserialize($b);
    ?>
    

    我将test类中的hello变量赋值为phpinfo();然后输出获取序列化字符串
    然后反序列化这个字符串
    本来我想结果应该是funphpinfo();,但不是,没有结果输出。

    这段话整篇看完了回过头再看...写的逻辑是这样的
    这边很疑惑,就算hello是空,也应该有fun吧。。。但却是没有...希望有大佬指点迷津
    但是如果直接new test() 会有输出的结果fun....
    

    懵了,想错了?
    hello已经被赋值了啊,应该会执行的啊...
    懵了一会突然想明白了。
    __construct是类实例化的时候执行的,也就是说,当new test()的时候,这个函数就执行了,而这时候hello的值还是空的。
    所以我把construct改成了destruct,对象销毁时执行的函数,(代码全部执行完毕才会执行的函数)。
    2333结果对了,输出了funphpinfo;
    把echo换成eval,执行了phpinfo(),舒服了。
    流程大概就是这样的:
    test类中,有一个未赋值的hello变量,和一个代码结束后执行的函数
    先new test(),然后将hello的变量值赋值成phpinfo()
    代码执行完毕后,会去eval这个phpinfo这个函数。
    反序列化做的就是去赋值。
    这样理解起来感觉就没有那么难了,哈哈哈。
    (但总觉得事情应该不会这么简单吧,就这个代码目前看来应该就是赋值,想象一些复杂得场景,几个类和方法,函数相互调用,诶,其实说到底也就是赋值吧...只是赋的值和赋值后函数执行的复杂程度了。

    相关文章

      网友评论

          本文标题:php反序列化_2

          本文链接:https://www.haomeiwen.com/subject/rennjqtx.html