Position actuelle: Accueil> Derniers articles> Sérialiser et non désérialisé la sécurité: comment empêcher les attaques d'injection d'objets?

Sérialiser et non désérialisé la sécurité: comment empêcher les attaques d'injection d'objets?

gitbox 2025-05-19

En tant que langage de programmation côté serveur largement utilisé, PHP occupe une position importante dans le développement Web. Comme de plus en plus d'applications PHP sont exposées à Internet, les problèmes de sécurité deviennent progressivement au centre des développeurs. Dans PHP, les fonctions sérialize () et nonsérialize () sont largement utilisées pour gérer la sérialisation et la désérialisation des objets et des tableaux. Cependant, ces fonctions peuvent également devenir des vulnérabilités potentielles pour les attaquants pour mener des "attaques d'injection d'objets". S'il n'est pas évité, un attaquant peut modifier le comportement de l'application par des données malveillantes soigneusement construites et même entraîner de graves problèmes de sécurité tels que l'exécution de code distant (RCE).

Cet article analysera les problèmes de sécurité des fonctions sérialize () et non sérialisées () en PHP, et fournira des mesures efficaces pour empêcher les attaques d'injection d'objets.

Aperçu des fonctions sérialisées et non sérialisées dans PHP

Serialize () et Unserialize () sont deux fonctions importantes en PHP pour la sérialisation et la désérialisation des objets et des tableaux.

  • Serialize () : convertit les variables PHP (y compris les objets, les tableaux, etc.) en chaînes qui peuvent être stockées ou transférées. Par exemple, vous pouvez convertir un objet ou un tableau en une chaîne et le stocker dans une base de données.

  • Unserialize () : il s'agit de reconvertir une chaîne sérialisée en type de données d'origine de PHP (comme un objet ou un tableau).

 $data = ['name' => 'John', 'age' => 30];
$serializedData = serialize($data);
echo $serializedData;  // Sortir:a:2:{s:4:"name";s:4:"John";s:3:"age";i:30;}

Le code ci-dessus sérialise un tableau de données $ dans une chaîne. Si vous le stockez dans la base de données, vous pouvez plus tard le restaurer sur le tableau d'origine via Unserialize () .

Le principe de l'attaque d'injection d'objets

L'attaque par injection d'objets fait référence à l'attaquant qui construit des données spéciales sérialisées, de sorte que la fonction PHP Unserialize () exécute du code malveillant ou modifie le comportement de l'application lors de la désérialisation des données. Ce type d'attaque se produit généralement lorsque les applications PHP ne vérifient pas entièrement les données d'entrée.

Par exemple, supposons qu'un attaquant construit les données malveillantes suivantes:

 $maliciousData = 'O:8:"UserClass":1:{s:4:"name";s:4:"evil";}';
unserialize($maliciousData);

Parmi eux, Userclass est une classe de l'application. L'attaquant crée un objet malveillant à travers les données sérialisées et la transmet à la fonction Unserialize () sans vérification, déclenchant ainsi le constructeur de l'objet et peut conduire à des vulnérabilités de sécurité.

Comment empêcher les attaques d'injection d'objets?

Afin d'empêcher les attaques d'injection d'objets, les développeurs peuvent prendre les mesures efficaces suivantes:

1. Désactiver le chargement automatique des classes non fiables

Pendant le processus de désérialisation, la fonction Unserialize () tentera de charger la classe si les données contient un nom de classe. Si la classe existe dans l'application sans mesures de sécurité appropriées, des objets malveillants peuvent être créés et exécutés. Par conséquent, les classes qui peuvent être chargées pendant la désérialisation peuvent être restreintes par le paramètre ALLOD_CLASSS de Unserialize () .

 $data = 'O:8:"UserClass":1:{s:4:"name";s:4:"evil";}';
$unserializedData = unserialize($data, ['allowed_classes' => ['UserClass']]);

Si le nom de classe n'est pas explicitement répertorié, PHP n'autorisera pas la désérialisation des données contenant des noms de classe inconnus.

2. Filtrez et vérifiez les données d'entrée

Vérifier et filtrer strictement les données sérialisées entrantes pour s'assurer qu'elle ne contient aucun mauvais contenu. Avant d'accepter les données, vous pouvez utiliser des expressions régulières ou d'autres méthodes pour vérifier si la structure d'une chaîne sérialisée est légale.

 if (preg_match('/^[O|a|s|i|d|b|f|N|r|C|l|n]/', $inputData)) {
    $unserializedData = unserialize($inputData);
} else {
    die('Invalid serialized data');
}

3. Utilisez JSON au lieu de la sérialisation

S'il n'y a pas d'exigences spéciales, il est recommandé d'utiliser JSON_ENCODE () et JSON_DECODE () au lieu de Serialize () et Unserialize () . json_encode () et json_decode () ne sont pas facilement exploités pour les attaques d'injection d'objets, car ils ne peuvent gérer que des types de données simples (tels que des tableaux, des objets, des chaînes, des nombres, etc.) et n'impliqueront pas de classes et d'objets complexes.

 $data = json_encode($dataArray);
$decodedData = json_decode($data, true);

4. Utilisez des fichiers de configuration de PHP pour désactiver les fonctions dangereuses

Dans le fichier de configuration php.ini, la sécurité peut être améliorée en désactivant les fonctions spécifiques pour éviter l'utilisation accidentelle par les développeurs de ces fonctions. Pour empêcher les attaquants de provoquer des vulnérabilités de sécurité via Unserialize () , ils peuvent désactiver la fonction Unserialize () ou la limiter à une plage de confiance.

 disable_functions = "unserialize"

5. Utilisez la dernière version de PHP et des correctifs de sécurité

La communauté PHP publie régulièrement des mises à jour et des correctifs de sécurité pour corriger les vulnérabilités de sécurité potentielles. Les développeurs doivent toujours utiliser la dernière version de PHP et mettre à jour le système en temps opportun pour assurer la sécurité.

Protection pratique: meilleures pratiques de sécurité lors du traitement des données sensibles

En plus de protéger directement les fonctions sérialize () et non série () , les développeurs doivent également renforcer la gestion globale de la sécurité des données sensibles. Voici quelques meilleures pratiques de sécurité:

  1. Données sensibles chiffrées : pour les données sensibles stockées ou transmises, chiffrées à l'aide de forts algorithmes de chiffrement, tels que le cryptage AES, pour s'assurer que même si l'attaquant obtient les données, il ne peut pas être facilement fissuré.

  2. Vérification des entrées : Vérifiez strictement toutes les entrées utilisateur, en particulier les données reçues via des URL, des formulaires ou des API. Les bibliothèques existantes peuvent être utilisées pour prévenir les attaques communes telles que l'injection SQL, les XSS et le CSRF.

  3. Minimiser l'exposition des objets : essayez d'éviter d'exposer directement des objets sensibles ou complexes au client. Les données qui doivent être sérialisées ne doivent contenir que les informations nécessaires.

Résumer

Les fonctions sérialize () et nonsérialize () dans PHP fournissent aux développeurs des mécanismes de stockage et de transmission de données pratiques, mais les utiliser sans restrictions présenteront de sérieux risques de sécurité. Grâce à une configuration raisonnable, à la vérification des entrées, à l'utilisation d'alternatives et à la mise à jour opportune des versions PHP, les attaques d'injection d'objets peuvent être effectivement empêchées.

La chose la plus importante est: ne faites jamais confiance à la saisie des utilisateurs! Des stratégies de sécurité raisonnables et des mesures de protection peuvent efficacement améliorer la sécurité des applications et réduire les risques potentiels.