Position actuelle: Accueil> Derniers articles> Pourquoi les objets de désérialisation peuvent-ils provoquer des vulnérabilités de sécurité en PHP?

Pourquoi les objets de désérialisation peuvent-ils provoquer des vulnérabilités de sécurité en PHP?

gitbox 2025-06-11

Qu'est-ce que la désérialisation?

La désérialisation est le processus de reconvertissement des données stockées dans un certain format, comme un format de sérialisation unique à JSON ou PHP, dans un objet ou une structure de données. Dans PHP, la désérialisation se fait souvent via la fonction `Unserialize (), qui peut restaurer les données enregistrées après sérialisation à l'aide de la fonction` `Serialize () 'à l'objet ou à la table d'origine.

Utilisation de base de la désérialisation

En PHP, la désérialisation semble être un processus simple, et de nombreux développeurs utilisent fréquemment cette fonctionnalité dans leur code. Par exemple:

classe utilisateur {
    Nom $ public $;
    public $ e-mail;
}
$ user = new User ();
$ user-> name = "Alice";
$ user-> email = "[email protected]";
// objet sérialisé $ serializeseser = serialize ($ user);
// désérialiser l'objet $ nonsérializedUser = Unserialize ($ serializedUser);

Bien que cette opération ne soit pas en apparence problématique, le risque potentiel est que la désérialisation puisse introduire de graves vulnérabilités de sécurité.

Risques de sécurité de la désérialisation

L'un des principaux problèmes causés par la désérialisation est la sécurité. Les utilisateurs malveillants peuvent implanter n'importe quel objet en contrôlant les données fournies à la fonction «Unserialize ()», puis utilisez ces objets pour effectuer des opérations non autorisées.

Attaque d'injection d'objet

Les attaques d'injection d'objets sont un moyen courant d'attaquer. Les attaquants peuvent construire des données sérialisées spécifiques pour créer un objet d'une classe existante, puis déclencher certaines méthodes. Supposons qu'il existe une méthode qui contient des opérations sensibles, et un attaquant peut appeler cette méthode en envoyant des données sérialisées spécialement conçues, entraînant des vulnérabilités de sécurité inutiles.

classe admin {
    fonction publique DeleteUser () {
        // Supprimer la logique de l'utilisateur}
}
// L'objet malveillant construit par l'attaquant $ malivectiousobject = 'o: 5: "admin": 0: {}'; // L'objet malveillant se non sérialisée ($ MALICOYOBJET);

Dans cet exemple, l'objet malveillant est créé de manière incorrecte et a déclenché la méthode «DeleteUser», affectant potentiellement la sécurité de l'ensemble du système.

Manque de vérification des données

L'absence de vérification efficace des données pendant la désérialisation est également un problème important. De nombreux développeurs n'effectuent pas de vérifications de légalité sur les données lors de la désérialisation, provoquant un plan des programmes lors du traitement des objets illégaux ou affichent des réponses imprévues. Dans ce cas, un attaquant peut transmettre de fausses données pour exploiter les vulnérabilités potentielles dans le code.

Comment éviter les problèmes de désérialisation

Pour réduire les risques de sécurité posés par désérialisation, plusieurs pratiques peuvent aider les développeurs.

Utilisez JSON comme alternative

Envisagez d'utiliser JSON au lieu des méthodes de sérialisation spécifiques au PHP. JSON est un format d'échange de données léger qui n'a pas la possibilité d'exécuter du code. Par conséquent, même si les données sont falsifiées, un attaquant ne peut pas simplement injecter du code exécutable.

$ data = ['name' => 'Alice', 'email' => '[email protected]'];
$ JSONDATA = JSON_ENCODODE ($ DATA); // sérialiser à JSON
$ decodeddata = json_decode ($ jSondata); // désérialisation

Restreindre les classes qui peuvent être désérialisées

PHP fournit un deuxième paramètre à la fonction «Unserialize», à travers laquelle les objets non autorisés peuvent être restreints. Par exemple, lorsque `Unserialize ()` est appelé, la classe qui permet la désérialisation peut être explicitement définie.

$ autoriséClasses = ['utilisateur'];
$ nonserializedObject = Unserialize ($ SerializedData, ["ALLOD_CLASSES" => $ ALLODCLASSES]);

Résumer

Les objets désérialisants peuvent sembler une fonctionnalité simple et pratique en PHP, mais les risques de sécurité derrière eux ne peuvent pas être ignorés. Les développeurs doivent prendre sérieusement les opérations pertinentes de désérialisation, adopter les alternatives et les mesures de sécurité appropriées pour réduire la surface d'attaque potentielle. Ce n'est qu'en garantissant la sécurité du code et la fiabilité des données que la sécurité des données des applications et leurs utilisateurs peuvent être protégées efficacement.