PHP序列化重写私有“受保护和stdClass”;“反思”;
我在Marco Pivetta的文章中读到,classPHP序列化重写私有“受保护和stdClass”;“反思”;,php,serialization,Php,Serialization,我在Marco Pivetta的文章中读到,classprivate和protected属性可以通过(数组)通过简单的强制转换读取,并在属性之前附加一些“键”: “\0*\0”-用于受保护; “\0CLASSNAME\0”-用于专用 class Foo { protected $a = 'protected_prop'; private $b = 'private_prop'; function out(){ var_dump($this->a); va
private
和protected
属性可以通过(数组)
通过简单的强制转换读取,并在属性之前附加一些“键”
:
“\0*\0”
-用于受保护;
“\0CLASSNAME\0”
-用于专用
class Foo {
protected $a = 'protected_prop';
private $b = 'private_prop';
function out(){
var_dump($this->a);
var_dump($this->b);
}
}
$F = new F();
$data = (array)$F;
var_dump($data["\0*\0a"]);
var_dump($data["\0Foo\0b"]);
// output
string(14) "protected_prop"
string(12) "private_prop"
然后我决定尝试覆盖私有和受保护的属性。这个“键”(\0Foo\0b)让我想起了序列化
$F = serialize($F);
$F = str_replace('protected_prop','new_protected_prop',$F);
$F = str_replace('private_prop','new_private_prop',$F);
$F = preg_replace_callback ( '!s:(\d+):"(.*?)";!', function($match) {
return ($match[1] == strlen($match[2])) ? $match[0] : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
},$F ); // fix unserialize(): Error at offset after str_replacing. Found on SO ^)
$F = unserialize($F);
if ($F instanceof Foo){
$F->out();
}
// output
string(18) "new_protected_prop"
string(16) "new_private_prop"
object(Foo)#1 (2) {
["a":protected]=> string(18) "new_protected_prop" // changed
["b":"Foo":private]=> string(16) "new_private_prop" // changed
}
问题:为什么我们可以通过此方法在外部更改所有私有和受保护的属性?还是序列化中的it语言(PHP)冲突?谢谢
您认为“受保护”是什么意思?@sectus在OOP中是什么意思-对私有和受保护成员的外部访问(读/写)。Languange不必保护私有和受保护成员免受所有可能的修改,IMHO。甚至这些成员还可以通过设计(反射)用语言编辑。此外,编辑序列化对象的文本不是OOP概念的一部分。