Start · Sprachen · PHP · Referenz · libxml_disable_entity_loader

libxml_disable_entity_loader

Funktion

Deaktiviert oder aktiviert das Laden externer Entities in libxml, um XXE-Angriffe (XML External Entity Injection) zu verhindern.

seit PHP 5.2.11 Kategorie: xml

Signatur

libxml_disable_entity_loader(bool $disable = true): bool

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

Typ
bool
Beschreibung
Gibt den vorherigen Zustand zurück: 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';
}
?>
Produkt: Apfel, Preis: 1.99 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.