Я пишу веб-приложение с 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. Я могу взломать его для непризнанных объектов, он просто возвращает исходную строку (т.е. "& Ent;" ). Однако эта библиотека разочаровывает: потому что это SAX-парсер, я должен написать кучу обработчиков (целых 9..).
Так можно ли использовать встроенные библиотеки, получить объекты, подобные DOM, и защитить себя от этих различных уязвимостей DoS? спасибо
Эта страница описывает три уязвимости и предоставляет решение... если бы я использовал .NET: http://msdn.microsoft.com/en-us/magazine/ee335713.aspx
UPDATE:
<?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);
?>
Я попробовал loadXML($s, LIBXML_NOENT);
. В обоих случаях я заканчиваю сброс 300+ МБ. Есть что-то, чего я еще не вижу?