PHP Object Injection(PHP对象注入)
文:https://vagosec.org/2013/09/wordpress-php-object-injection/
最近做wechall的PHP遇到一个题,琢磨了好久才知道咋整,感觉wechall网站的题总是百度不到答案,真是有点蛋疼。好了进入正题。
那道题主要是考的序列化与反序列化。
1、魔术方法
这里我们先简单介绍一下php中的魔术方法(这里如果对于类、对象、方法不熟的先去学学吧),即Magic
方法,php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号__
开头的,比如 __construct
, __destruct
,__toString
,__sleep
,__wakeup
等等。这些函数都会在某些特殊时候被自动调用。
例如__construct()
方法会在一个对象被创建时自动调用,对应的__destruct
则会在一个对象被销毁时调用等等。
2、php对象的序列化与反序列化(serialize和unserialize)
php允许保存一个对象方便以后重用,这个过程被称为序列化,即serialize()函数,对应的反序列化就是unserialize()。
简单的说,序列化就是把PHP对象按照一定规则存成一个字符串,而反序列化就是把序列化之后的字符串恢复成一个PHP对象。
这里我们简单测试一下吧:
<?php
class test
{
public $username = '';
public $password = '';
}
$a = new test();
$a->username = 'serial';
$a->password = 'serial';
echo serialize($a);
?>
输出为:
O:4:"test"