RFC: Filtered unserialize()
Cette RFC partait de l’idée que la dé-sérialisation de données n’est pas sûre, puisqu’il est, dans certains cas, possible d’injecter du code qui pourrait être automatiquement exécuté (par le destructeur de classe, par exemple) — bien sûr, cela suppose qu’on essaye de dé-sérialiser des données provenant d’une source non réellement sûre (ce que font probablement certaines applications).
Elle proposait donc de modifier la fonction unserialize()
de PHP pour permettre d’interdire la dé-sérialisation d’objets ou de limiter celle-ci à un ensemble de classes listées.
Dans le cas où on essayerait de dé-sérialiser un objet non autorisé, on obtiendrait en retour une instance de classe incomplète, comme lorsqu’on essaye de dé-sérialiser un objet dont la classe n’existe pas.
Exemples :
// ceci va tout dé-sérialiser comme auparavant
$data = unserialize($foo);
// Ceci va convertir tous les objets en objets __PHP_Incomplete_Class
$data = unserialize($foo, ["allowed_classes" => false]);
// Ceci va convertir tous les objets à l'exception des instances de MyClass et de MyClass2 en objets __PHP_Incomplete_Class
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);
// Ceci va accepter toutes les classes comme étant par défaut
$data = unserialize($foo, ["allowed_classes" => true]);
Les votes ont été ouverts le 3 novembre 2014 et ont été clos le 10 novembre 2014. Considérant qu’apporter un niveau de sécurité lors de la dé-sérialisation de données ne pouvait être que bénéfique, nous avons posté en ce sens sur internals@
.
Cette RFC a été adoptée par 17 votes contre 6.