gpt4 book ai didi

java - 如何修复修复 XXE 漏洞时出现的 JAXB Unmarshal 异常?

转载 作者:行者123 更新时间:2023-12-02 10:52:39 26 4
gpt4 key购买 nike

我们要处理的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: unexpected element (uri:"", local:"ns0:MessageType"). Expected elements are <{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 声明等。所有这些都给了我们与上述完全相同的异常(exception)。无论如何,这是 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 注释,它会在运行时导致相同异常的类似版本。

请注意代码中没有语法错误。我所经历的一切都在将其变成一个问题的过程中。我完全有可能是一个错过了一些极其基本的东西的 SCSS 。如果您能指出这一点,我将不胜感激。谢谢。

最佳答案

使 sax 解析器 namespace 感知解决了该问题:

spf.setNamespaceAware(true);

最后,无事生非太多了。

关于java - 如何修复修复 XXE 漏洞时出现的 JAXB Unmarshal 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52041769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com