Java Sonar:禁用XML外部实体(XXE)处理

Java Sonar:禁用XML外部实体(XXE)处理,java,sonarqube,Java,Sonarqube,我使用javax.xml.validation.Validator验证我的xml,如下所示 专用最终验证程序验证程序; ... SchemaFactory工厂=SchemaFactory.newInstance(“http://www.w3.org/2001/XMLSchema"); setProperty(xmlstants.ACCESS\u EXTERNAL\u DTD,“”); setProperty(xmlstants.ACCESS_EXTERNAL_SCHEMA,“”); Schema

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

专用最终验证程序验证程序;
...
SchemaFactory工厂=SchemaFactory.newInstance(“http://www.w3.org/2001/XMLSchema");
setProperty(xmlstants.ACCESS\u EXTERNAL\u DTD,“”);
setProperty(xmlstants.ACCESS_EXTERNAL_SCHEMA,“”);
Schema=factory.newSchema(新文件(getResource(path));
validator=schema.newValidator();
validator.setProperty(xmlstants.ACCESS\u EXTERNAL\u DTD,“”);
setProperty(xmlstants.ACCESS_EXTERNAL_SCHEMA,“”);

你知道为什么sonar说这个代码不符合吗?

你必须设置
XMLConstants。访问外部DTD
XMLConstants。访问外部模式
到“”

以下代码不会对Sonarint和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\u支持外部实体
XMLInputFactory.SUPPORT\u 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,则通过删除项目的目标文件夹来清理缓存

有关更多信息:

在IntelliJ中,我没有为Sonar插件面对这个问题,如果使用setFeature,我会面临这个问题。