我使用非验证读取来显示或处理不受信任的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特定安全管理器属性或特殊解析器。
答案 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();