【问题标题】:Can JAXB be configured to prevent entity expansion attacks?可以配置 JAXB 以防止实体扩展攻击吗?
【发布时间】:2011-03-11 14:38:29
【问题描述】:

通常在 java 中解析 XML 时,使用

可以避免成为entity expansion attacks 的受害者

dbf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);

其中 dbf 是 DocumentBuilderFactory,用于为 XML 解析创建 DocumentBuilder。

但是,假设我正在使用 JAXB 解组一些 XML,例如像这样:

  final JAXBContext context = JAXBContext.newInstance(MyClass.class);
  final Unmarshaller unmarshaller = context.createUnmarshaller();
  final MyClass result = (MyClass) unmarshaller.unmarshal(input);

如何配置 JAXB 以在底层 XML 解析器上使用 FEATURE_SECURE_PROCESSING?

在谷歌上搜索答案会得到以下最佳结果: http://forums.java.net/node/699983

但是,我不想为了使实体扩展可配置而引入 XMLStreamFactory 等的实现。有没有办法只使用 JAXB API 来解决这个问题?

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    Java SE 5 将实体扩展的数量限制为 64,000:

    我希望所有 JAXB 实现都会保留此默认保护。但是,如果您想 100% 确定您可以通过以下方式创建 SAXSource 并让 JAXB 解组:

    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
    SAXParser sp = spf.newSAXParser();
    XMLReader xmlReader = sp.getXMLReader();
    SAXSource saxSource = new SAXSource(xmlReader, inputSource);
    

    有关详细信息,请参阅:

    【讨论】:

    • 您能解释一下XMLConstants.FEATURE_SECURE_PROCESSING 的原因吗?如果设置为true,应该是什么。在 docs.oracle.com 上我发现:true instructs the implementation to process XML securely. This may set limits on XML constructs to avoid conditions such as denial of service attacks. 但它到底是什么?我尝试了一个大小为 4MB 的 XML 文件,它仍然被解析。提前致谢
    【解决方案2】:

    我使用的代码与 Blaise 的回答中的代码非常相似,最近发现它有一个微妙的问题。我从 SAXParser 获得的 XMLReader 未配置为理解命名空间,这意味着它无法正确处理可空元素,例如

    <myType>
        <myIntegerElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    </myType>
    

    不是 JAXB 将 myIntegerElement 解组为 Java 中的 null 整数,而是解码为 Integer.valueOf(0);我的代码的一个重要区别。解决方案是将解析器工厂设置为可感知名称空间:

    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setNamespaceAware(true);
    spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
    SAXParser sp = spf.newSAXParser();
    // and so on
    

    我觉得这很令人惊讶,因为如果我通过 XMLReaderFactory.createXMLReader() 获得 XMLReader,那么阅读器对可空元素没有问题,但它也不理解 XMLConstants.FEATURE_SECURE_PROCESSING。

    【讨论】:

      【解决方案3】:

      嗯,首先 xmlstreamfactory 的东西是 jdk 的一部分,所以你不需要“引入实现”它们。其次,您始终可以自己(安全地)解析 DOM,然后在 DOM 而不是原始流上执行 JAXB。最后,您还可以创建自己的 SAXParser(为安全处理而配置),并将其传递给 JAXB(Blaise 提到过,刚刚看到)(jdk 中的内置 jaxb impl 使用来自 SAXParser 的 XMLReader 作为内部解析器输入流)。

      【讨论】:

      • JAXB 实现会因处理 InputStream 的方式而异。例如 EclipseLink JAXB (MOXy)(我是技术负责人)将使用 StAX 解析器(如果可用),因为它通常比 SAX 解析器更快。
      • @Blaise - 当然,我在评论开头提到使用 StAX。
      • 我的评论是为了回应“jaxb 使用来自 SAXParser 的 XMLReader 作为 InputStream 的内部解析器”,JAXB 实现可以使用 XMLReader,但也可以使用 StAX。
      【解决方案4】:

      javax.xml.parsers.SAXParserFactory

      SAXParserFactory spf = SAXParserFactory.newInstance();
      spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); 
      SAXParser sp = spf.newSAXParser();
      XMLReader xmlReader = sp.getXMLReader();
      SAXSource saxSource = new SAXSource(xmlReader, inputSource);  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-10
        • 2015-04-08
        • 2012-07-04
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        相关资源
        最近更新 更多