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

标签 java xml security sonarqube builder

我有几个 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));

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

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 在我的公司中甚至不存在)。

最佳答案

Refer this for general XXE information

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

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

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

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

关于java - XML 解析器不应容易受到 XXE 攻击。解决零影响的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73031712/

相关文章:

java - 如何在 LambdaJ 中创建值为 Collection 的 Map?

php - 这个 PHP/MySQL 删除函数安全吗?

mysql - 如何保护用户名、密码、api_keys

java - Java EE 6 中的编程身份验证

java - java中如何求中位数

java - 使用 Java EE Bean 保存表单数据列表并打印 JSF XHTML 数据表中的数据

java - 过滤维基百科的 XML 转储 : error on some accents

c# - 更改用于 XML 序列化的 XmlElement 名称

java - 重写而不是附加到 XML 文件

xml - yyyy-mm-dd 格式的日期不会抛出错误