libxml_set_external_entity_loader()
Aujourd'hui, nous allons aborder la fonction libxml_set_external_entity_loader() en PHP. Cette fonction enregistre une fonction de rappel personnalisée pour gérer les entités externes dans les documents XML, principalement afin de prévenir les attaques par entité externe XML (XXE).
Qu'est-ce que la fonction libxml_set_external_entity_loader() ?
La fonction libxml_set_external_entity_loader() est une fonction intégrée de PHP qui enregistre une fonction de rappel personnalisée pour intercepter le chargement des entités externes dans les documents XML. Introduite dans PHP 5.1.0, elle est principalement utilisée pour sécuriser l'analyse XML contre les vulnérabilités XXE. Notez que PHP 8.0.0 a mis à jour la signature du rappel pour inclure des indications de type et un type de retour, améliorant ainsi la sécurité des types et la compatibilité.
Comment utiliser la fonction libxml_set_external_entity_loader()
La fonction libxml_set_external_entity_loader() est simple à utiliser. Vous définissez une fonction de rappel qui reçoit l'ID public, l'ID système et le contexte de l'entité, puis retournez le contenu de l'entité sous forme de chaîne ou null pour bloquer le chargement.
Voici un exemple d'utilisation de la fonction libxml_set_external_entity_loader() :
Comment utiliser la fonction libxml_set_external_entity_loader() en PHP ?
<?php
// Define a custom function to load external entities
function my_entity_loader(?string $publicId, ?string $systemId, ?array $context): ?string
{
// Block loading if systemId is missing or invalid to prevent XXE/SSRF
if ($systemId === null || !is_string($systemId)) {
return null;
}
// Load the external entity safely
$content = @file_get_contents($systemId);
return $content !== false ? $content : null;
}
// Set the custom entity loader function
libxml_set_external_entity_loader('my_entity_loader');
// Load an XML file into a DOMDocument object
$doc = new DOMDocument();
$doc->load('example.xml');
?>Dans cet exemple, nous définissons une fonction de rappel compatible PHP 8 qui valide le systemId et récupère l'entité de manière sécurisée à l'aide de file_get_contents(). Le retour de null indique à libxml de sauter le chargement de l'entité, ce qui est la méthode standard pour bloquer les ressources externes potentiellement dangereuses. Nous enregistrons ensuite le rappel avec libxml_set_external_entity_loader() et chargeons le fichier XML.
Conclusion
La fonction libxml_set_external_entity_loader() est un outil essentiel pour sécuriser l'analyse XML en PHP. En interceptant les requêtes d'entités externes, les développeurs peuvent efficacement atténuer les attaques XXE et contrôler l'accès aux ressources. Ce guide a couvert l'objectif de la fonction, les exigences de signature PHP 8 et un exemple d'implémentation sécurisé.
Pratique
Quel est l'objectif principal de la fonction PHP libxml_set_external_entity_loader() ?