【问题标题】:Sonar: Disable XML external entity (XXE) processing声纳:禁用 XML 外部实体 (XXE) 处理
【发布时间】:2020-08-20 08:26:11
【问题描述】:

我正在使用 javax.xml.validation.Validator 来验证我的 xml,如下所示

        private final Validator validator;
        ...

        SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
        factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
        Schema schema = factory.newSchema(new File(getResource(path)));
        validator = schema.newValidator();
        validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
        validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");

知道为什么 sonar 说这段代码不合规吗?

【问题讨论】:

  • 在 IntelliJ 中我没有遇到声纳插件的这个问题,如果使用 setFeature 我会遇到问题。

标签: java sonarqube


【解决方案1】:

您必须将XMLConstants.ACCESS_EXTERNAL_DTDXMLConstants.ACCESS_EXTERNAL_SCHEMA 设置为“”。

以下代码不会违反 SonarLint 和 SonarQube。

private Validator validator;
...
    
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema(new File(getResource(path)));
validator = schema.newValidator();
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");

然后,阻止您验证它的外部实体。 例如,如果您使用的是 STAX 解析器。然后将XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIESXMLInputFactory.SUPPORT_DTD设置为False

XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE);
factory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE);
validator.validate(new StAXSource(factory.createXMLStreamReader(inputStream)));

如果您使用的是 sonarLint,请通过删除项目的目标文件夹来清理缓存。

更多信息: https://rules.sonarsource.com/java/RSPEC-2755

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 2015-04-03
    • 2018-02-28
    • 2019-10-07
    • 2018-01-01
    • 1970-01-01
    • 2012-06-20
    • 2016-05-01
    • 1970-01-01
    相关资源
    最近更新 更多