Wie kann ich die verschiedenen XML-Bibliotheken von PHP verwenden, um DOM-ähnliche Funktionen zu erhalten und DoS-Schwachstellen wie Billion Laughs oder Quadratic Blowup zu vermeiden?

Ich schreibe eine Webanwendung mit einer XML-API in PHP und mache mir Sorgen über drei spezifische Sicherheitslücken, die alle mit Inline-DOCTYPE-Definitionen zusammenhängen: lokale Dateieinbeziehung, Explosion quadratischer Einheiten und Explosion exponentieller Einheiten. Ich würde gerne PHP (5.3) verwenden, das in Bibliotheken integriert ist, aber ich möchte sicherstellen, dass ich nicht dafür anfällig bin.

Ich habe festgestellt, dass ich LFI mit libxml_disable_entity_loader eliminieren kann, aber dies hilft nicht bei Inline-ENTITY-Deklarationen, einschließlich Entitäten, die auf andere Entitäten verweisen.

Die SimpleXML-Bibliothek (SimpleXMLElement, simplexml_load_string usw.) ist großartig, da sie ein DOM-Parser ist und alle meine Eingaben ziemlich klein sind. es erlaubt mir, xpath zu benutzen und das DOM ziemlich leicht zu manipulieren. Ich kann mir nicht vorstellen, wie ich ENTITY-Deklarationen stoppen soll. (Gerne deaktiviere ich, wenn möglich, alle Inline-DOCTYPE-Definitionen.)

Mit der XML-Parser-Bibliothek (xml_parser_create, xml_set_element_handler usw.) kann ich den Standardhandler, der Entitäten enthält, mit xml_set_default_handler festlegen. Ich kann es so hacken, dass es für nicht erkannte Entitäten einfach die ursprüngliche Zeichenfolge zurückgibt (dh "& ent;"). Diese Bibliothek ist jedoch frustrierend: Da es sich um einen SAX-Parser handelt, muss ich eine Reihe von Handlern schreiben (bis zu 9 ..).

Ist es also möglich, die eingebauten Bibliotheken zu verwenden, DOM-ähnliche Objekte herauszuholen und mich vor diesen verschiedenen DoS-Schwachstellen zu schützen? Vielen Dank

Diese Seite beschreibt die drei Sicherheitslücken und bietet eine Lösung ... wenn ich nur .NET verwenden würde:http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

AKTUALISIEREN:

<code><?php
$s = <<<EOF
<?xml version="1.0?>
<!DOCTYPE data [
<!ENTITY en "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....">
]>
<data>&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;.....</data>
EOF;
$doc = new DOMDocument();
$doc->loadXML($s);
var_dump($d->lastChild->nodeValue);
?>
</code>

Ich habe es versuchtloadXML($s, LIBXML_NOENT); auch. In beiden Fällen lösche ich 300+ MB. Fehlt mir noch etwas?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage