Java 使用XmlOptions从xml中删除DOCTYPE及其包含的标记

Java 使用XmlOptions从xml中删除DOCTYPE及其包含的标记,java,xml,security,parsing,fortify,Java,Xml,Security,Parsing,Fortify,我有以下请求,我想删除DOCTYPE及其包含的实体标记。我没有解析器访问权限,但在类中我可以传递XMlOptions,所以有没有任何方法可以使用XMlOptions删除DOCTYPE,这样就可以删除XMl enity扩展Vunerability 我用来发送的请求 <!DOCTYPE foo [ <!ENTITY xeebri2n0 "o16ja"> <!ENTITY xeebri2n1 "&xeebri2n0;&xeebri2

我有以下请求,我想删除DOCTYPE及其包含的实体标记。我没有解析器访问权限,但在类中我可以传递XMlOptions,所以有没有任何方法可以使用XMlOptions删除DOCTYPE,这样就可以删除XMl enity扩展Vunerability

我用来发送的请求

<!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>
在上述SubmitPaymentRequestWrapper.java类中,我无法访问SubmitPaymentRequestDocument.java,因此,
是否有任何方法可以使用传递的XMLOptions解除或删除DOCTYPE?

我们通常不会手动删除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\u DTD
的行将完全禁用doctype。如果我正确地调用它,那么所有定义的实体都将替换为空字符串(不要接受我的单词-测试它)

XMLInputFactory.IS\u SUPPORTING\u EXTERNAL\u ENTITIES
的关系就在这里,因为我已经发现,Java默认配置中的XML解析器不易受到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");

thnx作为答案,但我并没有使用任何一个,我没有在SAXBuilder或JAXBand中更改的权限。当我使用SAXReaderies时,实体的值仍然在标记中。字符串仅禁用外部实体,而不是整个doctype。不幸的是,Dom4J禁用doctype将引发异常:因此我需要防止xml攻击,这就是为什么我要使用该功能。是否有任何方法可以在不引发异常的情况下删除整个doctype并处理数据而不引发doctype
SAXBuilder builder = new SAXBuilder();
File xmlFile = new File("test.xml");
builder.setExpandEntities(false);
Document document = builder.build(xmlFile);
SAXReader reader = new SAXReader();
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
Document document = reader.read("test.xml");