Как я могу использовать различные 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 МБ. Есть ли что-то, чего мне еще не хватает?