Signatur
Beschreibung
libxml_get_external_entity_loader() liefert den aktuell aktiven Callback, der für das Auflösen externer XML-Entities zuständig ist. Dieser Callback wird immer dann aufgerufen, wenn libxml beim Parsen eines XML-Dokuments auf eine externe Entity-Referenz trifft (z. B. eine DTD oder eine externe Datei-Referenz).
Standardmäßig – wenn kein eigener Loader gesetzt wurde – gibt die Funktion null zurück. Ein null-Rückgabewert bedeutet, dass der interne Standard-Mechanismus von libxml verwendet wird, der externe Entities auflöst, sofern dies nicht durch andere Mittel unterbunden wurde.
Die Funktion ist nützlich, wenn man den aktuell gesetzten Loader temporär speichern, ersetzen und später wiederherstellen möchte – etwa in Test-Frameworks oder bei der Implementierung von Middleware, die den Loader nur vorübergehend überschreiben soll. Sie ermöglicht ein sauberes Stacking von Entity-Loader-Implementierungen.
Seit PHP 8.0 wird das direkte Laden externer Entities standardmäßig deaktiviert; dennoch ist es Best Practice, einen sicheren Loader explizit zu setzen und dessen Zustand mit dieser Funktion zu prüfen.
Rückgabewert
libxml_set_external_entity_loader() gesetzt, wird null zurückgegeben, was dem Standard-Verhalten von libxml entspricht.Beispiele
Aktuellen Entity-Loader auslesen
<?php
// Prüfen ob ein benutzerdefinierter Loader registriert ist
$currentLoader = libxml_get_external_entity_loader();
if ($currentLoader === null) {
echo 'Kein benutzerdefinierter Loader gesetzt (Standard-Verhalten aktiv).' . PHP_EOL;
} else {
echo 'Benutzerdefinierter Loader ist aktiv.' . PHP_EOL;
var_dump($currentLoader);
}
Loader temporär ersetzen und danach wiederherstellen
<?php
// Sicherer No-Op-Loader: verweigert alle externen Entities
$safeLoader = function (?string $publicId, string $systemId, array $context): ?string {
// Gibt null zurück => externe Entity wird nicht geladen
return null;
};
// Aktuellen Loader speichern
$previousLoader = libxml_get_external_entity_loader();
// Eigenen sicheren Loader setzen
libxml_set_external_entity_loader($safeLoader);
// XML parsen (externe Entities werden blockiert)
$xml = '<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY ext SYSTEM "http://evil.example.com/data">]><root>&ext;</root>';
$doc = new DOMDocument();
$doc->loadXML($xml);
echo 'XML geparst – externe Entity wurde blockiert.' . PHP_EOL;
// Ursprünglichen Loader wiederherstellen
libxml_set_external_entity_loader($previousLoader);
$restoredLoader = libxml_get_external_entity_loader();
echo 'Loader wiederhergestellt. Ist null: ' . ($restoredLoader === null ? 'ja' : 'nein') . PHP_EOL;
// Wichtig · Fallstricke
Sicherheitshinweis (XXE – XML External Entity Injection): Das unkontrollierte Auflösen externer XML-Entities ist eine bekannte Sicherheitslücke (XXE). Angreifer können darüber lokale Dateien auslesen oder serverseitige Anfragen auslösen (SSRF). Setzen Sie immer einen sicheren Loader, der externe Entities verweigert, wenn Sie nicht sicher sind, dass die verarbeiteten XML-Daten vertrauenswürdig sind.
libxml_get_external_entity_loader() wurde in PHP 8.2.0 eingeführt. In älteren PHP-Versionen (vor 8.2) gibt es keine offizielle Möglichkeit, den aktuell gesetzten Loader abzufragen.
Ab PHP 8.0 wird das Laden externer Entities durch DOMDocument, SimpleXML und verwandte Klassen standardmäßig verhindert. Dies ändert jedoch nichts daran, dass ein explizit gesetzter unsicherer Loader weiterhin greift.