gpt4 book ai didi

java - 使用默认 sax 解析器时,jaxb unmarshal 会被精心制作的 xml 滥用吗?

转载 作者:搜寻专家 更新时间:2023-11-01 02:55:58 27 4
gpt4 key购买 nike

因此,在我当前的项目中,我将 JAXB RI 与来自 Sun 的 JRE(我认为是 Xerces)的默认 Java 解析器一起使用来解码任意 XML。

首先我使用XJC编译了一个如下形式的XSD:

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="foobar">
...
</xs:element>
</xs:schema>

在“良好情况”下,一切都按设计工作。也就是说,如果我传递的 XML 符合此模式,那么 JAXB 会正确地将其解码到对象树中。

当我通过外部 DTD 引用传递 XML 时,问题就来了,例如

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foobar SYSTEM "http://blahblahblah/foobar.dtd">
<foobar></foobar>

在像这样解码后,SAX 解析器尝试加载远程实体(“http://somehost/foobar.dtd”),尽管这个片段显然不符合我之前使用 XJC 编译的模式。

为了避免这种行为,因为我知道任何符合规范的 XML(根据我编译的 XSD)永远不需要加载远程实体,我必须定义一个自定义 EntityResolver 来短路所有远程实体的加载实体。所以不要做类似的事情:

MyClass foo = (MyClass) myJAXBContext.createUnmarshaller().unmarshal(myReader);

我被迫这样做:

XMLReader myXMLReader = mySAXParser.getXMLReader();
myXMLReader.setEntityResolver(myCustomEntityResolver);
SAXSource mySAXSource = new SAXSource(myXMLReader, new InputSource(myReader));
MyClass foo = (MyClass) myJAXBContext.createUnmarshaller().unmarshal(mySAXSource);

所以我的最终问题是:

当使用 JAXB 解码时,当相关 XML 在不加载远程实体的情况下被识别为无效时,底层 SAX 解析器加载远程实体是否应该自动短路?

此外,这看起来不像是安全问题吗?鉴于 JAX-WS 依赖于引擎盖下的 JAXB,我似乎可以将特制的 XML 传递到任何基于 JAX-WS 的 Web 服务,并导致 WS 主机加载任意 URL。

我是这方面的新手,所以我可能缺少一些东西。如果是这样,请告诉我!

最佳答案

一个精心设计的问题,值得一个答案:)

一些注意事项:

  1. JAXB 运行时不依赖于 XML 模式。它使用 SAX 解析器生成 SAX 事件流,用于绑定(bind)到对象模型。该对象模型可以手写,也可以使用 XJC 从模式生成,但绑定(bind)和运行时彼此截然不同。因此,可能知道良好的 XML 输入在运行时符合模式,但 JAXB 却不知道。
  2. 强制运行时加载远程 DTD 引用不构成安全漏洞。如果在它的末尾有一个真正的 DTD,最坏的情况是它不会验证。如果它不是真正的 DTD,那么它将被忽略。
  3. DTD 被认为已过时,因此高级 JAXB API 不直接支持它。如果您需要 EntityResolver,则需要深入研究 SAX API,您已经完成了。
  4. 如果您的类模型是从 XML 模式生成的,那么您应该考虑在运行时使用 SchemaFactoryUnmarshaller.setSchema() 对其进行验证。这将指示 Xerces 在传递给 JAXB 之前根据模式验证 SAX 事件。这不会阻止获取 DTD,但它增加了一层安全性,您知道数据是好的。

关于java - 使用默认 sax 解析器时,jaxb unmarshal 会被精心制作的 xml 滥用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1638528/

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