Как я могу использовать различные XML-библиотеки PHP, чтобы получить DOM-подобные функции и избежать DoS-уязвимостей, таких как Billion Laughs или Quadratic Blowup?

Я пишу веб-приложение, которое имеет XML API в PHP, и я беспокоюсь о трех конкретных уязвимостях, связанных с определениями встроенного DOCTYPE: включение локального файла, разветвление квадратичной сущности и разложение экспоненциальной сущности. Я бы хотел использовать встроенные в PHP библиотеки (5.3), но я хочу убедиться, что я не восприимчив к ним.

Я обнаружил, что могу устранить LFI с помощью libxml_disable_entity_loader, но это не помогает с встроенными объявлениями ENTITY, включая сущности, которые ссылаются на другие сущности.

Библиотека SimpleXML (SimpleXMLElement, simplexml_load_string и т. Д.) Хороша тем, что она является анализатором DOM, и все мои входные данные довольно малы; это позволяет мне использовать xpath и довольно легко манипулировать DOM. Я не могу понять, как остановить объявления ENTITY. (Я был бы рад отключить все встроенные определения DOCTYPE, если это возможно.)

Библиотека XML Parser (xml_parser_create, xml_set_element_handler и т. Д.) Позволяет мне установить обработчик по умолчанию, который включает в себя сущности, с помощью xml_set_default_handler. Я могу взломать его, чтобы для нераспознанных объектов он просто возвращал исходную строку (т. Е. & Amp; ent;). Хотя эта библиотека разочаровывает: поскольку это SAX-парсер, я должен написать несколько обработчиков (целых 9 ..).

Так можно ли использовать встроенные библиотеки, извлекать DOM-подобные объекты и защищать себя от этих различных DoS-уязвимостей? Спасибо

Эта страница описывает три уязвимости и предоставляет решение ... если бы я только использовал .NET:http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

ОБНОВИТЬ:

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

Я старалсяloadXML($s, LIBXML_NOENT); также. В обоих случаях я получаю более 300 МБ. Есть ли что-то, чего мне еще не хватает?

Ответы на вопрос(2)

Ваш ответ на вопрос