PHP反序列化

PHP反序列化

为了能够跨平台存贮,有时候我们会将对象的信息转化为可以存储或传输的形式,这就是序列化(比如json),相应的,我们把数据恢复回来,就叫反序列化。

php相关函数:

serialize() 返回一个包含字节流的字符串,序列化对象返回的字符串似乎与其打印出的字符串有所不同。(可能有部分内容没有显示,似乎是两个字符的差异,所以修改时建议使用str_replace())

unserialize() 重新把字符串恢复成原来的值【相当于反序列化】

ps:序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。为了能够unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。 如果要想在另外一个文件中反序列化一个对象,这个对象的类必须在反序列化之前定义,可以通过包含一个定义该类的文件或使用函数spl_autoload_register()来实现

__wakeup()绕过:

(PHP5<5.625&&PHP7<7.0.10)

__wakeup触发于unserilize()调用之前,但是如果被反序列化的对象的个数小于指定个数时,虽然会反序列化但不会触发__wakeup

private修饰变量的序列化的类名和字段名前面要加空,可用%00修饰

protected修饰变量的序列化的字段名前要加%00*%00


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!