Удалите DOCTYPE и содержащие его теги из xml с помощью XmlOptions - PullRequest
1 голос
/ 13 июля 2020

У меня есть запрос ниже, и я хочу удалить DOCTYPE и связанные с ним теги ENTITY. У меня нет доступа к парсеру, но в классе я могу передать XMlOptions, поэтому есть ли способ удалить DOCTYPE с помощью XMLOptions, поэтому XMl возможность расширения enity будет удалена

запрос, который я использую для отправки

<!DOCTYPE foo [
<!ENTITY xeebri2n0 "o16ja">
<!ENTITY xeebri2n1 "&xeebri2n0;&xeebri2n0;">
<!ENTITY xeebri2n2 "&xeebri2n1;&xeebri2n1;">
<!ENTITY xeebri2n3 "&xeebri2n2;&xeebri2n2;">]>
<SubmitPaymentRequest xmlns="http://www.qwest.com/XMLSchema" xmlns:bim="http://www.qwest.com/XMLSchema/BIM">
    <EPWFHeaderInfo>
        <RequestId>IR1BCSRDQBSIRW7745 &xeebri2n3;<RequestId>
        <SendTimeStamp>2019-12-23T14:23:01.183-05:00<SendTimeStamp>
        <MessageSrcSystem>IPS<MessageSrcSystem>
    </EPWFHeaderInfo>
</SubmitPaymentRequest>

EPWFSubmitPaymentEventHandler. java класс, где я использую указанный выше класс для синтаксического анализа

EPWFSubmitPaymentEventHandler{
public String handleEventMessage(String inXml, XmlObject xmlBean, Map<String, String> metaInfo) {


SubmitPaymentRequestWrapper request = new SubmitPaymentRequestWrapper(inXml);

}
}

класс, где я анализирую xml.

  SubmitPaymentRequestWrapper {

    public SubmitPaymentRequestWrapper(String reqXml, XmlOptions options) throws XmlException {
            this(SubmitPaymentRequestDocument.Factory.parse(reqXml, options));
        }
}

в вышеприведенном SubmitPaymentRequestWrapper . java класс Я не могу получить доступ к SubmitPaymentRequestDocument. java Итак, есть ли способ, которым я могу отключить или удалить DOCTYPE с помощью передачи XMLOptions?

1 Ответ

0 голосов
/ 13 июля 2020

Обычно мы не удаляем элементы doctype вручную, а параметризируем синтаксический анализатор, чтобы он игнорировал их. Как это сделать, к сожалению, сильно зависит от того, какой это парсер. В JAXB это можно сделать так:

XMLInputFactory xif = XMLInputFactory.newFactory();
xif.setProperty(XMLInputFactory.SUPPORT_DTD, false);
// xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource("test.xml"));

Строка с XMLInputFactory.SUPPORT_DTD полностью отключит doctype. Если я правильно помню, все определенные сущности будут заменены пустыми строками (не верьте мне на слово - проверьте это).

Строка с XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES есть, потому что я обнаружил, что * Парсеры 1015 * в конфигурации Java по умолчанию не уязвимы для атак XML бомб (например, той, что у вас есть в XML). Атака остановится после 60k итераций довольно быстро (помните - не верьте мне на слово). Поэтому после долгого тестирования я решил останавливать только внешние сущности, которые являются помехой и небезопасным по умолчанию в Java.

Если вы используете не JAXB, а JDOM, то предотвращение внешних сущностей будет выглядеть иначе. :

SAXBuilder builder = new SAXBuilder();
File xmlFile = new File("test.xml");
builder.setExpandEntities(false);
Document document = builder.build(xmlFile);

В Dom4J тоже по-другому:

SAXReader reader = new SAXReader();
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
Document document = reader.read("test.xml");
...