Как исправить это Unmarshal Exception с JAXB, которое возникло при исправлении уязвимостей XXE? - PullRequest
0 голосов
/ 27 августа 2018

Формат XML-сообщения, которое мы должны обрабатывать, таков:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:MessageType xmlns:ns0="http://www.path.to/some/schema.xsd">
    <ns0:NonRelevantBody>
        ....
    </ns0:NonRelevantBody>
</ns0:MessageType>

Исключение получено:

javax.xml.bind.UnmarshalException: непредвиденный элемент (uri: "", local: "ns0: MessageType"). Ожидаемые элементы: <{<a href="http://www.path.to/some/schema.xsd" rel="nofollow noreferrer">http://www.path.to/some/schema.xsd}MessageType>

Это исключение возникает в com.xmlprocessor.MessageParser классе. Код в указанном классе был таким (и работал целую вечность):

StringReader stringReader = new StringReader(xmlMessageAsString);

JAXBContext context = new JAXBContext.newInstance(MessageObjectFactory.class);
Unmarshaller unmarshalr = context.createUnmarshaller();
this.messageTypeContent = (MessageTypeContent) unmarshalr.unmarshal(stringReader);

Оказывается, это может привести к плохому случаю XXE. Итак, мы попробовали несколько очень похожих вещей DocumentBuilder, SAXParser и т. Д. Для отключения внешних сущностей, декларации Doctype и подобных вещей. Все дали нам одно и то же исключение, изложенное выше. В любом случае, вот что изменилось с SAXParser:

StringReader stringReader = new StringReader(xmlMessageAsString);

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

Source xmlSource = new SAXSource(spf.newSAXParser().getXMLReader(), new InputSource(stringReader));

JAXBContext context = new JAXBContext.newInstance(MessageObjectFactory.class);
Unmarshaller unmarshalr = context.createUnmarshaller();
this.messageTypeContent = (MessageTypeContent) unmarshalr.unmarshal(xmlSource);

Код для com.xmlprocessor.MessageTypeContent как таковой неизменен:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "messageType",
    "messageApprovalType"
})
@XmlRootElement(name = "MessageType")
public class MessageTypeContent {
    // Likely irrelevant unless you say so.
}

Я пробовал несколько вещей, включая добавление namespace = "ns0" или namespace = "http://www.path.to/some/schema.xsd" к аннотации @ XmlRootElement , это приводит к аналогичным версиям того же исключения во время выполнения.

Обратите внимание, что в коде нет синтаксических ошибок. Все, что произошло с моим, находилось в процессе превращения его в вопрос. Вполне возможно, что я упускаю из виду что-то очень простое. Я был бы очень признателен, если бы вы могли указать на это. Спасибо.

1 Ответ

0 голосов
/ 31 августа 2018

Устранение проблемы с пространством имен анализатора саксофонов:

spf.setNamespaceAware(true);

В конце концов, слишком много шума из ничего.

...