XML解析器不应该容易受到XXE攻击.零影响的最佳解决方法?



我有几个SonarQube漏洞,其中一个引起了我的注意。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {           
DocumentBuilder db = dbf.newDocumentBuilder();
dom = db.parse(sIn);
} catch (ParserConfigurationException pce) {
log.error("ERROR-pce***************************"+pce.getMessage(),pce);
throw pce;
} catch (SAXException se) {
log.error("ERROR-se**********************"+se.getMessage(),se);
throw se;
} catch (IOException ioe) {
log.error("ERROR-ioe*********************"+ioe.getMessage(),ioe);
throw ioe;
}

你可以在我的代码中看到,我有一个新的DocumentBuilder();然后解析这个:

InputStream sIn = new ByteArrayInputStream(contenidoXml.getBytes(StandardCharsets.UTF_8));

声纳解决方案是做以下事情之一:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// to be compliant, completely disable DOCTYPE declaration:
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
// or completely disable external entities declarations:
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
// or prohibit the use of all protocols by external entities:
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");

这是遗留代码,我在这里迷路了。谁能给我解释一下这三种解决方案之间的区别,以及哪一种解决方案更有可能对代码产生零影响(我们必须更新不同的类,但上次部署时SQ在我的公司甚至不存在)。

有关XXE的一般信息

禁用DOCTYPE声明-禁用DOCTYPE处理,可能的影响是文档可能无法验证,只有格式良好性检查才能完成

禁用外部实体-如果在文档中声明外部实体将不会被取消引用,实体的值(如果在文档中使用)将为空,或者(取决于配置的底层解析器)可以通过解析异常

禁止使用协议——解析器不会使用任何协议访问外部DTD或Schema。所有外部DTD、模式都应该通过SYSTEM标识符在本地可用,或者注册到解析器

您选择的方法很大程度上取决于您正在解析的文档。如果它使用模式,禁用DOCTYPE可能是一个很好的解决方案。如果保证文档不使用外部实体,禁用DOCTYPE和外部实体可能是更好的方法

相关内容

最新更新