当前位置: 首页 > 知识库问答 >
问题:

如何用JAXB修复这个在修复XXE漏洞时出现的Unmarshal异常?

拓拔迪
2023-03-14

我们应该处理的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。绑定解组异常:意外元素(uri:,本地:“ns0: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.
}

我尝试了很多方法,包括将命名空间="ns0"或命名空间="http://www.path.to/some/schema.xsd"添加到@XmlRootElement注释中,它会导致运行时相同异常的类似版本。

请注意代码中没有语法错误。我的任何想法都是在把它变成一个问题的过程中产生的。我完全有可能是一个错过了一些外在基本知识的吉特。如果你能指出这一点,我将不胜感激。谢谢

共有1个答案

井轶
2023-03-14

使sax解析器命名空间感知修复了该问题:

spf.setNamespaceAware(true);

最后,无事生非。

 类似资料:
  • 在我创建了一个新的Angular 12.0.3项目后,立即检测到8个高漏洞和40个中等漏洞。 当尝试使用修复问题时,没有任何变化。将漏洞减少到9个中度漏洞和7个高度漏洞,但当我尝试运行项目时,由于版本不匹配,会显示以下错误: 我已经尝试按照此答案中描述的解决方案修复漏洞,但这破坏了项目。 此外,我使用angle-cli的v11-lts创建了一个项目,但同样的问题伴随着不同的漏洞: 有没有办法,修复

  • Checkmarx在我的Controller类中为以下方法提供了XSS漏洞。具体来说:此元素的值(ResultsVO)随后在代码中流动,而没有经过适当的清理或验证,最终在方法中显示给用户: ResultsVO对象有很多String属性,我只是想知道是否有一种优雅的方法来编码它们以防止此漏洞。

  • 问题内容: 当我运行它说npm audit fixnpm audit。 但是,输出 这是否意味着它不应该由用户修复? 当我运行它时,它会给我表的列表,类似于此: 在此示例中,链接页面的补救部分说。但是,其中有几行: 不再有lodash依赖项。因此它应该已经是v4.17.5。我还检查了哪条线。在有这些线路: 我认为该版本显示在“ _id”中,而不是在“ _from”中,因此版本是正确的,但漏洞仍会出

  • 我开始学习react,并通过运行以下程序创建了我的第一个应用程序: npx创建-反应-应用程序我的应用程序 应用程序建成后,我在终端上收到一个警告,上面写着: 22个漏洞(9个中度,13个高度) 我试图通过运行以下命令来修复它: “npm审核修复程序” 但它返回了这个: npm错误!代码ERE解决npm错误!ERESOLVE无法解析依赖关系树npm错误!npm错误!发现:类型-fest@0.21.

  • 尝试为旧版spring boot应用程序更新log4j2(使用spring-boot-parent-1.5.6.RELEASE)——使用多模块 尝试了spring在最近的文档中建议的所有方法,但都没有奏效 已尝试选项: 选项1-添加到属性 选项2-添加starter-log4j2并排除核心,稍后添加log4j核心(最新) 选项3-仅上述选项和log4j2 api 但是导入的依赖项仍然是slf4j-

  • 本文向大家介绍修复bash漏洞的shell脚本分享,包括了修复bash漏洞的shell脚本分享的使用技巧和注意事项,需要的朋友参考一下 在网上搜资料找到一个大神写的shell修复bash漏洞脚本,觉得很不错,拖到我blog里来共享给大家. 脚本内容: