Cet article partage principalement avec vous les connaissances pertinentes sur les principes de sérialisation et de désérialisation PHP dans la série sur les vulnérabilités de désérialisation PHP. Les amis qui en ont besoin peuvent s'y référer. J'espère que cela aide tout le monde.
Préface
La sérialisation et la désérialisation des objets ne seront pas décrites en détail. Le résultat de la sérialisation en PHP est une chaîne personnalisée en PHP. est quelque peu similaire à json.
Nous devons résoudre plusieurs problèmes lors de la conception de la sérialisation et de la désérialisation d'objets dans n'importe quel langage
Après la sérialisation d'un objet, le résultat de la sérialisation Il a une fonction auto-descriptive (connaître le type spécifique de l'objet à partir du résultat de la sérialisation.
Il ne suffit pas de connaître le type. Bien sûr, il faut aussi connaître la valeur spécifique correspondant à ce type
php fournit nativement une fonction de sérialisation d'objet, contrairement à c++...^_^ Il est également très simple à utiliser, juste deux interfaces.
<.>
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();
Selon les trois questions que j'ai mentionnées ci-dessus, nous pouvons alors passer à autre chose. jetez un œil
fobnn O:5:"fobnn":2:{s:7:"hack_id";i:1;s:16:"fobnnhack_name";s:5:"fobnn";} fobnn
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();
Une fois la sérialisation terminée. Après cela, __wakeup sera utilisé ici, nous pouvons effectuer un travail de suivi, comme la reconnexion à la base de données. 3. Personnaliser l'interface sérialisable
fobnn O:5:"fobnn":1:{s:16:"fobnnhack_name";s:5:"fobnn";} haha
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();
fobnn C:5:"fobnn":23:{{"id":1,"name":"fobnn"}} fobnn
Nous modifions le résultat de la désérialisation de hack_name en type int, i:12345
On peut constater que l'objet a été sérialisé avec succès ! Et cela peut fonctionner normalement. Bien sûr, ce mécanisme de PHP fournit une syntaxe flexible et modifiable, mais il introduit également des risques de sécurité ! analyser PHP plus tard Problèmes de sécurité causés par les fonctionnalités de sérialisation et de désérialisation.
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();
Partage d'exemples de code d'exemple de sérialisation de formulaire jQuery
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)
Explication détaillée de la vulnérabilité de désérialisation de session de PHP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!