Position actuelle: Accueil> Derniers articles> Utilisez la sérialisation et la non-désérialisation: erreurs courantes et compétences de débogage

Utilisez la sérialisation et la non-désérialisation: erreurs courantes et compétences de débogage

gitbox 2025-05-27

Dans PHP, Serialize () et Unserialize () sont des outils importants pour gérer la persistance des données et l'échange de données. Ces deux fonctions peuvent convertir des structures de données complexes en formats de chaîne (sérialisation), ou convertir les formats de chaîne en structures de données d'origine (désérialisation). Cependant, bien qu'ils semblent simples à utiliser, ils sont toujours sujets à certaines erreurs courantes lorsqu'elles sont utilisées. Cet article présentera comment utiliser correctement Serialize () et Unserialize () , et analyser certaines erreurs courantes et leurs techniques de débogage.

1. Utilisation de base de Serialize () et Unserialize ()

Fonction sérialize ()

La fonction Serialize () est utilisée pour convertir les structures de données PHP (telles que les tableaux, les objets, etc.) en format de chaîne. Cette chaîne peut être stockée dans un fichier, une base de données ou transférée vers un autre système. La syntaxe de base est la suivante:

 <?php
$data = array('name' => 'Alice', 'age' => 25);
$serializedData = serialize($data);
echo $serializedData;
?>

Le résultat de sortie est similaire à:

 a:2:{s:4:"name";s:5:"Alice";s:3:"age";i:25;}

Fonction Unserialize ()

La fonction Unserialize () est utilisée pour restaurer la chaîne sérialisée au type de données PHP d'origine. La syntaxe de base est la suivante:

 <?php
$serializedData = 'a:2:{s:4:"name";s:5:"Alice";s:3:"age";i:25;}';
$data = unserialize($serializedData);
print_r($data);
?>

Le résultat de la sortie est:

 Array
(
    [name] => Alice
    [age] => 25
)

2. Erreurs courantes et compétences de débogage

Bien que les fonctions sérialize () et nonsérialize () soient très puissantes, elles sont sujettes à certaines erreurs pendant l'utilisation. Voici quelques FAQ et des conseils de débogage:

Erreur 1: Erreur de format de données pendant la désérialisation

False est renvoyé lorsque la fonction Unserialize () ne peut pas analyser correctement la chaîne sérialisée. La raison la plus courante est que la chaîne sérialisée est un format incorrect. Par exemple:

 $invalidSerializedData = 'a:2:{s:4:"name";s:5:"Alice";';
$data = unserialize($invalidSerializedData);
if ($data === false) {
    echo "La désérialisation a échoué!";
}

Conseils de débogage : utilisez var_dump () ou print_r () pour imprimer la chaîne sérialisée pour vous assurer qu'elle n'est pas corrompue et se conforme au format de sérialisation.

Erreur 2: La désérialisation de l'objet a échoué

Si les données sérialisées contient un objet PHP et que le fichier de classe correspondant de l'objet n'existe pas ou n'est pas chargé pendant la désérialisation, unserialize () échouera. Supposons que vous sérialisiez un objet de classe et le stockez dans la base de données. Lorsque vous essayez de le désérialiser, si la classe n'est pas incluse correctement, le code rapportera une erreur.

 class User {
    public $name;
    public $age;
}

$serializedObject = serialize(new User());
$serializedObject = base64_encode($serializedObject);  // Supposons que les données sont stockées

// Puis récupérer et désérialiser à partir de la base de données
$serializedDataFromDB = base64_decode($serializedObject);
$user = unserialize($serializedDataFromDB);  // si User La classe n&#39;est pas définie,Rapportera une erreur

Conseils de débogage : assurez-vous que la définition de la classe est déjà incluse dans le script actuel ou utilisez SPL_AUTOLOAD_REGISTER () pour charger automatiquement la classe.

Erreur 3: Problèmes de sécurité lors de l'utilisation d'un non-service ()

Lors de l'utilisation de Unserialize () , les données entrantes peuvent être falsifiées, ce qui entraîne des vulnérabilités de sécurité potentielles. Par exemple, si les données entrées par l'utilisateur ne sont pas vérifiées ou si la source est inconnue, un utilisateur malveillant peut exécuter du code arbitraire via une attaque de désérialisation.

Solution : Évitez la désérialisation des données non fiables ou utilisez le deuxième paramètre d' Unserialize () pour limiter les classes qui peuvent être désérialisées. Par exemple:

 $user = unserialize($data, ["allowed_classes" => ["User"]]);

De cette façon, seuls les objets de la classe d'utilisateurs peuvent être désérialisés et les objets d'autres classes seront ignorés pour éviter les risques de sécurité potentiels.

Erreur 4: Les données sérialisées contiennent des types de ressources

Certains types de données PHP, tels que les poignées de fichiers, les connexions de la base de données et autres types de ressources, ne peuvent pas être sérialisés. Si vous essayez de sérialiser ces types de données, cela entraînera des erreurs ou une perte de données.

 $fileHandle = fopen('file.txt', 'r');
$serializedFile = serialize($fileHandle);  // Impossible de sérialiser les ressources

Conseils de débogage : Évitez d'inclure des types de ressources dans les données sérialisées. Si des informations de fichier persistantes ou des informations de connexion de la base de données sont nécessaires, elles peuvent être enregistrées comme des chaînes normales au lieu de sérialiser directement les ressources.

3. Conclusion

Serialize () et Unserialize () sont des outils très utiles en PHP, mais vous devez être prudent lorsque vous l'utilisez, en particulier lorsque vous traitez des données et des objets complexes. Comprendre ces erreurs courantes et ces conseils de débogage peut vous aider à éviter les pièges courants et à vous assurer que vos données peuvent être sérialisées et désérialisées correctement.

Si vous rencontrez des erreurs liées à la sérialisation pendant le développement, n'oubliez pas de vérifier le format des données, le chargement de la classe et la sécurité de la désérialisation. Avec ces conseils, vous pourrez utiliser les deux fonctions plus efficacement, réduisant les risques et les erreurs potentiels.