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

Gri*_*mak 5 java xml security builder sonarqube

我有一些 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;
}
Run Code Online (Sandbox Code Playgroud)

正如您在我的代码中看到的,我有一个 new DocumentBuilder(); 然后我解析这个:

InputStream sIn = new ByteArrayInputStream(contenidoXml.getBytes(StandardCharsets.UTF_8));
Run Code Online (Sandbox Code Playgroud)

声纳“解决方案”是执行以下操作之一:

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, "");
Run Code Online (Sandbox Code Playgroud)

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

Iro*_*uca 4

请参阅此处了解一般 XXE 信息

禁用 DOCTYPE 声明 - 禁用 DOCTYPE 处理,可能的影响是文档可能无法验证,仅进行格式正确检查

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

禁止使用协议 - 解析器不会使用任何协议来访问外部 DTD 或架构。所有外部 DTD、模式应可通过 SYSTEM 标识符在本地使用或向解析器注册

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