我有以下请求,我想删除DOCTYPE及其包含的ENTITY标记。我没有解析器访问权限,但在类中我可以传递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>
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));
}
}
在Above SubmitPaymentRequestWrapper.java类中,我无法访问SubmitPayment RequestDocument.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_DTD
的行将完全禁用doctype。如果我没有记错,那么所有定义的实体都将被空字符串替换(不要相信我的话——测试一下(。
XMLInputFactory.IS_SUPPORTING_EXTERNAL_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");