Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erläuterung der PHP-Serialisierungs- und Deserialisierungsprinzipien
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";} fobnnSiehe die zweite Zeile der Ausgabe. Diese Struktur ist eigentlich sehr leicht zu verstehen Sie können feststellen, dass die Zuordnung über den Objektnamen/Mitgliedsnamen erfolgt. Natürlich unterscheiden sich die Etikettennamen nach der Serialisierung von Mitgliedern mit unterschiedlichen Zugriffsrechten geringfügig.Gemäß den drei Fragen, die ich oben erwähnt habe, können wir es tun Werfen Sie einen Blick darauf1. Selbstbeschreibende FunktionO:5:"fobnn":2 wobei o den Objekttyp darstellt und der Typname fobnn ist 2 bedeutet, dass es zwei Mitgliedsobjekte gibt. Es handelt sich tatsächlich um die gleichen Unterbeschreibungen. Die selbstbeschreibende Funktion zeichnet die auf Objekte und Der Name des Mitglieds ist implementiert.2. LeistungsproblemeDie Zeitleistung der PHP-Serialisierung wird in diesem Artikel nicht analysiert, die Serialisierungsergebnisse jedoch Eigentlich ähnlich dem durch json/bson definierten Protokoll, es gibt einen Protokollheader, der Protokollheader beschreibt den Typ und der Protokollhauptteil beschreibt den dem Typ entsprechenden Wert, und das Serialisierungsergebnis wird nicht komprimiert
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 ) }Da die oben erwähnte selbstbeschreibende Funktion den Objekttyp im Serialisierungsergebnis speichert und PHP eine dynamisch typisierte Sprache ist, dann wir Sie können ein einfaches Experiment durchführen.
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!