Java 忽略XMLReader(XXE)中的XML doctype声明

Java 忽略XMLReader(XXE)中的XML doctype声明,java,xmlreader,Java,Xmlreader,我使用非验证读取来显示或处理不受信任的XML文档,其中我不需要对内部实体的支持,但我确实希望能够处理这些文档,即使显示DOCTYPE也是如此 使用SAX,我可以确保解析XML文档不会有外部实体或DOS扩展的风险。这也是专家组的建议 但是,不幸的是,当给定DOCTYPE时,这会中止解析: org.xml.sax.SAXParseException; systemId: file:... ; lineNumber: 2; columnNumber: 10; DOCTYPE is disall

我使用非验证读取来显示或处理不受信任的XML文档,其中我不需要对内部实体的支持,但我确实希望能够处理这些文档,即使显示DOCTYPE也是如此

使用SAX,我可以确保解析XML文档不会有外部实体或DOS扩展的风险。这也是专家组的建议

但是,不幸的是,当给定DOCTYPE时,这会中止解析:

org.xml.sax.SAXParseException; systemId: file:... ; lineNumber: 2; columnNumber: 10;
    DOCTYPE is disallowed when the
    feature "http://apache.org/xml/features/disallow-doctype-decl" set to true.
如果我忽略了这个致命错误,那么它将很高兴地解析内部实体,正如您在这里看到的:

我想知道,有没有一个功能组合可以让我阅读doctype声明,而不是评估它(特别是避免递归扩展)

我希望避免定义自己特定于Apache的安全管理器属性或特殊的解析器。

根据
XMLReaderFactory
将在Java 9中被弃用,获得
XMLReader
的方法将是使用SAX解析器

在这种情况下,可以使用(这会清除一些资源限制,并删除
访问\u外部\u DTD
\u架构
的远程架构处理程序):


如果您下载了Xerces库(而不是依赖JDK的内部Xerces库),则此代码无法防止XXE攻击。JDK版本被积极维护,以包括新的安全特性。如果必须使用下载的版本,并且需要使用DOCTYPE声明处理XML,则必须显式拒绝对外部实体的访问,并使用a来防止实体扩展攻击。@blurredd thatns注意,我自己也不确定什么更好,在受控环境中,一些断言可能就足够了。要支持多个解析器,将外部访问模式设置为空可能不够(而且安全管理器是特定于XNI的)。我想我会用硬编码实现。
org.xml.sax.SAXParseException; systemId: file:... ; lineNumber: 2; columnNumber: 10;
    DOCTYPE is disallowed when the
    feature "http://apache.org/xml/features/disallow-doctype-decl" set to true.
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setXIncludeaware(false);
// when FSP is activated explicit it will also restrict external entities
spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
XMLReader reader = spf.newSAXParser().getXMLReader();