PHP 7 : Les nouveautés

Sécuriser et sérialiser

Testez gratuitement nos 1271 formations

pendant 10 jours !

Tester maintenant Afficher tous les abonnements
Sérialiser des objets peut rapidement devenir dangereux. Découvrez comment faire, dans la pratique, pour sécuriser avec PHP 7.
05:37

Transcription

On va parler maintenant de la sérialisation en PHP. On faisait déjà ça en PHP5 sans aucun problème, mais il y a des petites nouveautés avec PHP7. Qu'est-ce qui se passe quand j'ai une classe User qui comporte une public name qui était à Julien ? Puis ensuite, pour l'instant, si on le sérialise au travers de la fonction serialize et on regarde ce qui se passe. En tout cas, on regarde le retour. On voit qu'ici on se retrouve avec une chaîne de caractères. La sérialisation, ça marche comme ça. On va sérialiser un objet, donc on va l'aplatir sous forme directement d'un objet à plat en string, et puis derrière on va pouvoir le récupérer. On remarque aussi quelque chose d'un peu dangereux, c'est que PHP, mais à l'intérieur de cette sérialisation, le nom de la classe. C'est un peu normal parce qu'à la désérialisation, on aimerait bien retrouver l'objet. Bon, on va faire de la désérialisation alors. Comment ça va marcher ? On va simplement ici avoir une variable que l'on va appeler object. Et on va le unserializer. Attention, on va unserializer pas l'objet, bien sûr, mais la chaîne de caractères. Derrière on va regarder un peu ce qui se passe, et pour pouvoir voir ça, ce qui serait intéressant c'est de voir si effectivement, il me conserve bien avec get_class, la classe de l'objet qui va être désérialisé. On enregistre et on relance. On voit qu'effectivement à la désérialisation, il me crée bien un objet et que si je fais un get_class sur l'objet, il est de classe User. Ça, vous allez me dire, c'est pas très grave. C'est vrai que c'est pas très grave. Maintenant on va essayer de pousser un petit peu et de rendre tout ça très dangereux. On va créer donc class Admin qui va étendre notre classe User. Et à cette classe Admin, on va lui mettre également une public qui va s'appeler power et qui va être à true. Ce qui veut dire que l'Admin, qui donc est un utilisateur classique, va lui par contre avoir du pouvoir et donc va pouvoir agir sur certaines parties du site. Évidemment si je crée un objet Admin dès le départ, et que je désérialise, je me retrouve avec un objet Admin à la fin. Vous remarquez qu'il y a bien ici power à true, power à un. Maintenant, imaginons qu'au départ, c'est un objet User... un User, tout ce qu'il y a de plus classique... mais qu'un pirate informatique s'amuse... parce que ça on va sûrement le sauvegarder en base de données... à venir modifier la data. Comment il va modifier la data ? Ben, simplement il pourrait venir injecter ou alors récupérer de l'information, peu importe et faire un remplacement, une str_replace de cette chaîne de caractères ici. Le zéro quatre User qu'on a là, il pourrait venir le remplacer tout simplement par quoi ? Par l'Admin, donc en le passant juste derrière. Regardez. On va prendre cette partie-là, ici, on va la copier, on va la mettre à cet endroit-là, et on va simplement lui demander de le faire sur la chaîne sérialiste. Ici je vais commencer avec un utilisateur, je vais sérialiser, quelqu'un va passer en plein milieu du processus, va faire un replace de User vers Admin et va se retrouver avec les pleins pouvoirs. Regardez ce qui se passe. Ça part de User à cet endroit-là et ça se retrouve en Admin. Qu'est-ce que c'est dangereux ça ! C'est pas possible de pouvoir faire ça. PHP7 nous apporte un petit peu plus de possibilités sur la désérialisation. On va pouvoir à cet endroit-là mettre un deuxième paramètre qui sera un array d'options. Dans ces options, on a une option très intéressante qui va nous permettre de contrôler les classes qui sont autorisées ou pas, et surtout de pouvoir contrôler si on veut qu'une classe soit autorisée ou pas. Comment on va faire ? On va simplement ici ouvrir un array et on va utiliser un paramètre qui existe, qui est possible, qui va s'appeler allowed_classes avec un 's'. Celui-ci, il est à true d'origine, donc on va le mettre à false. Si je fais ça et que je relance, je vais me rendre compte qu'à la fin, j'arrive avec un PHP Incomplete_Class ce qui veut dire qu'à cet endroit-là, j'aurais les datas, mais j'aurais pas la classe finale. Et ça c'est très intéressant, parce que ça va éviter à un pirate informatique de venir modifier l'objet et du coup, on n'aura pas la possibilité de désérialiser si on n'a pas donné cette possibilité à notre fonction de désérialisation. Alors, c'est super, mais c'est pas suffisant. Ce qui serait intéressant, ce serait carrément ici de lui dire quelle est la classe ou quelles sont les classes qui sont utilisables. Donc si je lui dis que c'est User qui est utilisable ici, eh bien, je vais pouvoir contrôler quelles sont les classes de désérialisation possibles pour une désérialisation particulière. Alors attention quand même parce que vous vous retrouvez avec un PHP Incomplete_Class à la fin. Ça ne va pas vous reconstruire complètement l'objet, mais en tout cas, ça va vous permettre de contrôler quelles sont les classes finales qui sont autorisées ou pas. Vous remarqueriez ici que si je rerécupère mon objet sans avoir fait la modification en plein milieu, eh bien, je vais récupérer un vrai objet User. Pourquoi ça ne marchait pas avant ? Je vous le réexplique. Tout simplement parce que le pirate était passé par là et avait supprimé User et remplacé ça par Admin ce qui veut dire qu'à cet endroit-là on se retrouvait avec un PHP Incomplete_Class, parce que nous n'avions absolument pas autorisé les utilisateurs Admins à être désérialisés à cet endroit-là. Donc ça, ça va vous garantir que votre désérialisation se fera avec une classe bien particulière, donc n'hésitez surtout pas à utiliser le allowed_class qui va vous permettre de garantir que les objets sont bien ceux que vous attendez et surtout qui va vous permettre de bloquer une injection ou une désérialisation un petit peu particulière où quelqu'un serait venu modifier la donnée. Sachez qu'en plus, ça, la sérialisation, ça peut s'utiliser dans les cookies, ça peut s'utiliser en sessions, on peut en faire un peu partout maintenant en programmation orientée objet, donc n'hésitez surtout pas à utiliser cette option, elle garantit beaucoup de sécurité.

PHP 7 : Les nouveautés

Profitez des nouveautés de PHP 7. Découvrez l’amélioration des performances globales, le nouvel opérateur de comparaison, le typage des paramètres scalaires, etc.

1h07 (24 vidéos)
Aucun commentaire n´est disponible actuellement
 
Logiciel :
Spécial abonnés
Date de parution :19 mai 2016

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !