Dieser Artikel teilt Ihnen hauptsächlich das relevante Wissen über die PHP-Serialisierungs- und Deserialisierungsprinzipien in der PHP-Deserialisierungs-Schwachstellenreihe mit. Freunde, die dies benötigen, können darauf zurückgreifen. Ich hoffe, es hilft allen.
Vorwort
Die Serialisierung und Deserialisierung von Objekten wird nicht im Detail beschrieben. Das Ergebnis der Serialisierung in PHP ist ein von PHP angepasstes Format ist json etwas ähnlich.
Wir müssen mehrere Probleme lösen, wenn wir die Serialisierung und Deserialisierung von Objekten in einer beliebigen Sprache entwerfen.
Nach der Serialisierung eines Objekts ist das Serialisierungsergebnis Es hat eine selbstbeschreibende Funktion (Den spezifischen Typ des Objekts aus dem Serialisierungsergebnis kennen.
Es reicht nicht aus, den Typ zu kennen. Natürlich müssen Sie auch den spezifischen Wert kennen, der diesem Typ entspricht
1 Deserialisierungsmethode unserialize
class fobnn { public $hack_id; private $hack_name; public function __construct($name,$id) { $this->hack_name = $name; $this->hack_id = $id; } public function print() { echo $this->hack_name.PHP_EOL; } } $obj = new fobnn('fobnn',1); $obj->print(); $serializedstr = serialize($obj); //通过serialize接口序列化 echo $serializedstr.PHP_EOL;; $toobj = unserialize($serializedstr);//通过unserialize反序列化 $toobj->print();
fobnn O:5:"fobnn":2:{s:7:"hack_id";i:1;s:16:"fobnnhack_name";s:5:"fobnn";} fobnn
2. Magische Methode bei der Deserialisierung
Entspricht dem zweiten oben genannten Problem. Tatsächlich gibt es eine Lösung durch eine magische Methode Benutzerdefinierte Serialisierungsfunktion. Lassen Sie uns zuerst die magischen Methoden __sleep und __wakeup vorstellen Serialisierung und Rückgabe eines Arrays von Mitgliedsnamen, die serialisiert werden müssen. In dem Fall, dass ich nur hack_name zurückgegeben habe, ist dies der Fall Ergebnis.
class fobnn { public $hack_id; private $hack_name; public function __construct($name,$id) { $this->hack_name = $name; $this->hack_id = $id; } public function print() { echo $this->hack_name.PHP_EOL; } public function __sleep() { return array("hack_name"); } public function __wakeup() { $this->hack_name = 'haha'; } } $obj = new fobnn('fobnn',1); $obj->print(); $serializedstr = serialize($obj); echo $serializedstr.PHP_EOL;; $toobj = unserialize($serializedstr); $toobj->print();
Über diese Schnittstelle können wir das Serialisierungs- und Deserialisierungsverhalten anpassen. Diese Funktion kann hauptsächlich zur Anpassung unseres Serialisierungsformats verwendet werden.
fobnn O:5:"fobnn":1:{s:16:"fobnnhack_name";s:5:"fobnn";} haha
Nach der Verwendung der benutzerdefinierten Serialisierungsschnittstelle ist unsere magische Methode nutzlos.
4. Dynamischer PHP-Typ und PHP-Deserialisierung
interface Serializable { abstract public string serialize ( void ) abstract public void unserialize ( string $serialized ) }
class fobnn implements Serializable { public $hack_id; private $hack_name; public function __construct($name,$id) { $this->hack_name = $name; $this->hack_id = $id; } public function print() { echo $this->hack_name.PHP_EOL; } public function __sleep() { return array('hack_name'); } public function __wakeup() { $this->hack_name = 'haha'; } public function serialize() { return json_encode(array('id' => $this->hack_id ,'name'=>$this->hack_name )); } public function unserialize($var) { $array = json_decode($var,true); $this->hack_name = $array['name']; $this->hack_id = $array['id']; } } $obj = new fobnn('fobnn',1); $obj->print(); $serializedstr = serialize($obj); echo $serializedstr.PHP_EOL;; $toobj = unserialize($serializedstr); $toobj->print();
Wir ändern das Deserialisierungsergebnis von hack_name in den Typ int, i:12345
fobnn C:5:"fobnn":23:{{"id":1,"name":"fobnn"}} fobnn
Es kann festgestellt werden, dass das Objekt erfolgreich wieder serialisiert wurde. Natürlich bietet dieser PHP-Mechanismus eine flexible und veränderbare Syntax, birgt jedoch auch Sicherheitsrisiken Sicherheitsprobleme, die durch Serialisierungs- und Deserialisierungsfunktionen verursacht werden.
Verwandte Empfehlungen:
Beispiel für jQuery-Formularserialisierung, Code-Beispielfreigabe
class fobnn { public $hack_id; public $hack_name; public function __construct($name,$id) { $this->hack_name = $name; $this->hack_id = $id; } public function print() { var_dump($this->hack_name); } } $obj = new fobnn('fobnn',1); $obj->print(); $serializedstr = serialize($obj); echo $serializedstr.PHP_EOL;; $toobj = unserialize($serializedstr); $toobj->print(); $toobj2 = unserialize("O:5:\"fobnn\":2:{s:7:\"hack_id\";i:1;s:9:\"hack_name\";i:12345;}"); $toobj2->print();
Erklärung zum Konvertieren von jQuery-serialisierten Formularwerten in Json-Beispiele
string(5) "fobnn" O:5:"fobnn":2:{s:7:"hack_id";i:1;s:9:"hack_name";s:5:"fobnn";} string(5) "fobnn" int(12345)
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der PHP-Serialisierungs- und Deserialisierungsprinzipien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!