Jak mogę używać różnych bibliotek XML PHP, aby uzyskać funkcjonalność podobną do DOM i uniknąć luk w DoS, takich jak miliardy śmiechów czy kwadratowe rozdmuchiwanie?

Piszę aplikację internetową, która ma API XML w PHP, i martwię się o trzy specyficzne luki, wszystkie związane z wbudowanymi definicjami DOCTYPE: dołączanie plików lokalnych, zdmuchiwanie jednostki kwadratowej i eksplozyjne rozszerzanie encji. Bardzo chciałbym używać wbudowanych w biblioteki PHP (5.3), ale chcę się upewnić, że nie jestem na nie podatny.

Znalazłem, że mogę wyeliminować LFI za pomocą libxml_disable_entity_loader, ale to nie pomaga w deklaracjach INTITY wbudowanych, w tym encji odnoszących się do innych podmiotów.

Biblioteka SimpleXML (SimpleXMLElement, simplexml_load_string itp.) Jest świetna, ponieważ jest to parser DOM i wszystkie moje dane wejściowe są dość małe; pozwala mi na łatwe używanie xpath i manipulowanie DOMem. Nie potrafię zrozumieć, jak zatrzymać deklaracje ENTITY. (Z przyjemnością wyłączyłbym wszystkie możliwe definicje DOCTYPE, jeśli to możliwe.)

Biblioteka XML Parser (xml_parser_create, xml_set_element_handler, itp.) Pozwala mi ustawić domyślny program obsługi, który zawiera encje, za pomocą xml_set_default_handler. Mogę go zhakować, więc dla nierozpoznanych bytów po prostu zwraca oryginalny ciąg (tj. „& Ent;”). Ta biblioteka jest jednak frustrująca: ponieważ jest to parser SAX, muszę napisać kilka procedur obsługi (aż 9 ..).

Czy można więc korzystać z wbudowanych bibliotek, usuwać obiekty podobne do DOM i chronić się przed różnymi lukami w DoS? dzięki

Ta strona opisuje trzy luki i dostarcza rozwiązania ... jeśli tylko korzystałem z .NET:http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

AKTUALIZACJA:

<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>

próbowałemloadXML($s, LIBXML_NOENT); także. W obu przypadkach kończę na dumpingu ponad 300 MB. Czy czegoś jeszcze brakuje?

questionAnswers(2)

yourAnswerToTheQuestion