Как отключить 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);