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

时间:2016-10-24 16:18:42

标签: java xmlreader

我使用非验证读取来显示或处理不受信任的XML文档,我不需要支持内部实体,但我确实希望能够处理,即使显示了DOCTYPE。

使用SAX的disallow DOCTYPE-decl feature,我可以确保解析XML文档没有外部实体或数十亿次笑声DOS扩展的风险。 OWASP XXE prevention cheat-sheet也建议这样做。

XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setFeature("http://apache.org/xml/features/continue-after-fatal-error", true);

reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

// or
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);    
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

然而不幸的是,当给出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.

如果我忽略了这个致命的错误,那么它将很乐意解决内部实体,你可以在这里看到:https://gist.github.com/ecki/f84d53a58c48b13425a270439d4ed84a

我想知道,是否有功能组合,所以我可以阅读但不评估doctype声明(特别是避免递归扩展)。

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

1 个答案:

答案 0 :(得分:1)

根据core-lib-dev,{9}将弃用XMLReaderFactory,获得XMLReader的方法是使用SAX Parser。

在这种情况下,可以使用FSP(它可以确定一些资源限制以及删除ACCESS_EXTERNAL_DTD_SCHEMA的远程模式处理程序):

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();