Signatur
Beschreibung
libxml_disable_entity_loader() steuert, ob libxml externe Entities in XML-Dokumenten auflösen darf. Externe Entities können in XML über <!ENTITY>-Deklarationen auf Dateien oder URLs verweisen. Ist das Laden aktiviert (Standardverhalten), können Angreifer über manipulierte XML-Dokumente beliebige lokale Dateien (z. B. /etc/passwd) auslesen oder Server-seitige Anfragen erzwingen (SSRF).
Durch den Aufruf libxml_disable_entity_loader(true) wird das Auflösen externer Entities unterbunden. Die Funktion gibt den vorherigen Zustand zurück, sodass er nach der Verarbeitung wiederhergestellt werden kann. Dies ist besonders wichtig bei der Verarbeitung von XML aus nicht vertrauenswürdigen Quellen wie Benutzereingaben, API-Antworten oder Datei-Uploads.
Die Funktion wirkt sich auf alle libxml-basierenden PHP-Erweiterungen aus, darunter DOMDocument, SimpleXML und XMLReader. Ab PHP 8.0.0 ist das Laden externer Entities standardmäßig deaktiviert, und die Funktion wurde als veraltet markiert. In PHP 8.0+ sollte stattdessen LIBXML_NONET oder LibXMLOptions genutzt werden.
In PHP-Versionen vor 8.0 sollte diese Funktion immer aufgerufen werden, bevor XML aus externen Quellen verarbeitet wird, um XXE-Schwachstellen zu verhindern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $disable | bool | true | Gibt an, ob das Laden externer Entities deaktiviert (true) oder aktiviert (false) werden soll. |
Rückgabewert
true, wenn das Laden zuvor deaktiviert war, false, wenn es aktiviert war. So kann der ursprüngliche Zustand nach der Verarbeitung wiederhergestellt werden.Beispiele
XXE-sichere Verarbeitung mit DOMDocument
<?php
// Externe Entities deaktivieren und vorherigen Zustand sichern
$prevValue = libxml_disable_entity_loader(true);
$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>
XML;
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NONET);
// Die externe Entity wird NICHT aufgelöst
echo $dom->saveXML();
// Vorherigen Zustand wiederherstellen
libxml_disable_entity_loader($prevValue);
?>
Sichere SimpleXML-Verarbeitung von Benutzer-XML
<?php
function parseUserXml(string $xmlString): ?SimpleXMLElement {
// Externe Entities sicher deaktivieren
$prevValue = libxml_disable_entity_loader(true);
libxml_use_internal_errors(true);
$result = simplexml_load_string($xmlString);
// Zustand wiederherstellen
libxml_disable_entity_loader($prevValue);
libxml_use_internal_errors(false);
return $result !== false ? $result : null;
}
$userInput = '<product><name>Apfel</name><price>1.99</price></product>';
$xml = parseUserXml($userInput);
if ($xml !== null) {
echo 'Produkt: ' . $xml->name . ', Preis: ' . $xml->price . ' EUR';
}
?>
// Wichtig · Fallstricke
Sicherheitswarnung (XXE): XML External Entity Injection (XXE) ist eine kritische Schwachstelle. Ohne diese Funktion (in PHP < 8.0) können Angreifer über manipulierte XML-Dokumente beliebige Dateien vom Server lesen, interne Netzwerke scannen (SSRF) oder Denial-of-Service-Angriffe (Billion Laughs) durchführen.
Deprecation: Ab PHP 8.0.0 ist libxml_disable_entity_loader() als veraltet markiert und erzeugt eine E_DEPRECATED-Warnung. In PHP 8.0+ sind externe Entities standardmäßig deaktiviert. Die Funktion wurde in PHP 8.0 nicht entfernt, aber sollte nicht mehr verwendet werden. Für PHP 8.0+ kann stattdessen die Konstante LIBXML_NONET beim Laden verwendet werden.
Gültigkeitsbereich: Die Einstellung ist global und betrifft alle libxml-Operationen im aktuellen Prozess. In Umgebungen mit mehreren gleichzeitigen Anfragen (z. B. Threads) sollte der Zustand sorgfältig verwaltet werden.