Как отключить XInclude при разборе XML?

Мне дали понять, что XInclude является потенциальной уязвимостью при получении XML из ненадежных источников. См. https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet

XML, который я ожидаю от внешних источников, довольно прост, и нет никаких требований для включения внешнего XML.

Я пробовал следующее, чтобы отключить XInclude (как рекомендуется в Шпаргалке):

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);

и использовал этот XML для тестирования

<?xml version="1.0" encoding="utf-8"?>
<data xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="file://d/temp/badxml.xml" parse="xml">
    </xi:include>
</data>

Внешний файл содержит недопустимый XML.

Я ожидал, что парсер потерпит неудачу, если setXIncludeAware установлен в true Но это не так. Фрагмент всегда разбирается. Я использую Java 8.

Это действительный тест? Это правильный способ избежать атак XInclude?

1 ответ

Решение

Это правильный способ избежать атак XInclude и сущностей, но это, как вы обнаружили, недопустимый тест для атак XInclude.

Согласно этому ответу, "поддержка XInclude опирается на поддержку пространства имен, которая по умолчанию отключена по причинам обратной совместимости". Так что звоните dbf.setNamespaceAware(true);

Другие вопросы по тегам