Hmm... D'apres la doc PHP pour unserialize:
Je trouve donc cela très "risqué" d'utiliser serialize et unserialize AVANT de vérifier la donnée d'entrée. En effet, l'utilisateur peut alors instancier n'importe quelle classe (donc, déjà, c'est assez chaud, surtout si l'utilisateur instancie une classe "Singleton" par exemple, ou instancie une classe qui est une collection d'objets qui vont saturer la mémoire).
Exemple:
Citation : La chaîne linéarisée.
Si la variable délinéarisée est un objet, après avoir réussi à le reconstruire, PHP appellera automatiquement la méthode __wakeup si elle existe.
Je trouve donc cela très "risqué" d'utiliser serialize et unserialize AVANT de vérifier la donnée d'entrée. En effet, l'utilisateur peut alors instancier n'importe quelle classe (donc, déjà, c'est assez chaud, surtout si l'utilisateur instancie une classe "Singleton" par exemple, ou instancie une classe qui est une collection d'objets qui vont saturer la mémoire).
Exemple:
Code PHP :
<?php
class test
{
public function __wakeup()
{
echo('I hacked you!');
}
}
$v = $_GET['obj'];
$u = unserialize($v);
// vérifier $u
?>
Si j'envoie, dans $get:
Code :
O:4:"test":0:{}
Alors l'objet "test" est instancié, et __wakeup() est appelée, et ce AVANT de vérifier la donnée utilisateur.
A mon avis, la bonne méthode consiste à vérifier d'abord les données utilisateurs, avant d'en faire quoi que ce soit, y compris un unserialize.
D'ailleurs, la documentation PHP va dans mon sens:
php.net a écrit :Avertissement
Ne passez pas d'entrée utilisateur non fiable à la fonction unserialize(). La délinéarisation peut résulter en une exécution de code chargé et exécuté lors de l'instanciation et l'auto-chargement d'objet, et ainsi, un utilisateur mal intentionné peut être capable d'exploiter ce comportement. Utilisez un standard d'échange sûr, comme JSON (via les fonctions json_decode() et json_encode()) si vous devez passer des données linéarisées à l'utilisateur.