当前位置: 首页 > 知识库问答 >
问题:

如何使Sonar与XMLInputFactory和woodstox库注册的实现兼容?

艾俊悟
2023-03-14

我正在努力遵守以下声纳拦截器规则:

XML解析器不应该容易受到XXE攻击(java: S2755)

XML规范允许使用内部或外部实体(文件系统/网络访问…)这可能导致机密文件泄露或SSRF等漏洞。

在Sonar规则描述中,他们给出了如何遵守的示例:

XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");  // compliant

我的问题是在应用程序的类路径中,有2个库wood stox-core-asl和wstx-aslcom.ctc.wstx.stax. /META-INF/services/javax.xml.stream.XMLInputFactory中注册自己的实现WstxInputFactory。此实现com.ctc.wstx.stax.WstxInputFactory不支持access ExternalDTD,因此失败并出现以下错误消息

无法识别的属性'http://javax.xml.XML常量/属性/访问ExternalDTD'

我成功地直接创建了一个新com。太阳xml。内部的流动XMLInputFactoryImpl()或类。forName(“com.sun.xml.internal.stream.XMLInputFactoryImpl”)。newInstance(),但它只是消除了另一个警告,即受限API上的警告。

对此有好的解决办法吗?

下面是一个最小的可复制示例,解决方法如注释行所示:

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

import javax.xml.XMLConstants;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.util.StreamReaderDelegate;

public class XMLReader extends StreamReaderDelegate implements AutoCloseable {
    
    private final Reader reader;

    public XMLReader(Reader reader) throws XMLStreamException, InstantiationException, IllegalAccessException, ClassNotFoundException {
        this.reader = reader;
        //XMLInputFactory factory = (XMLInputFactory) Class.forName("com.sun.xml.internal.stream.XMLInputFactoryImpl").newInstance();
        XMLInputFactory factory = XMLInputFactory.newInstance();
        factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
        factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
        setParent(factory.createXMLStreamReader(reader));
    }

    @Override
    public void close() throws XMLStreamException {
        try {
            super.close();
            reader.close();
        } catch (IOException e) {
            throw new XMLStreamException(e.getMessage(), e);
        }
    }

    public static void main(String[] args) throws XMLStreamException, InstantiationException, IllegalAccessException, ClassNotFoundException {
        try (XMLReader xmlReader = new XMLReader(new StringReader("</test>"))) {

        }
    }
}

此外,您还会发现以下Maven POM文件中列出的依赖项:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>test-xml</groupId>
    <artifactId>test-xml</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.woodstox</groupId>
            <artifactId>wstx-asl</artifactId>
            <version>3.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.woodstox</groupId>
            <artifactId>woodstox-core-asl</artifactId>
            <version>4.4.1</version>
        </dependency>
    </dependencies>
</project> 

共有1个答案

邵宏达
2023-03-14

显然,尽管规则描述中没有该属性,Sonar也可以识别XMLInputFactory属性。IS\u SUPPORTING\u EXTERNAL\u ENTITIES,它是执行相同操作的Stax标准属性:

工厂setProperty(XMLInputFactory.IS\u SUPPORTING\u EXTERNAL\u ENTITIES,false);

另见:

https://github.com/FasterXML/woodstox/issues/50

 类似资料:
  • 我想设置一个由多个步骤组成的用户注册。每个步骤将以条的形式突出显示。深灰色条将是完成的步骤,浅灰色条将是需要完成的步骤。似乎想不出这样做的方法。请建议。 我们可以在myfitnesspal注册中看到这一点。我在下图的红色框中突出显示了这一点。

  • 本文向大家介绍js实现登录与注册界面,包括了js实现登录与注册界面的使用技巧和注意事项,需要的朋友参考一下 完成登录与注册页面的HTML+CSS+JS,其中的输入项检查包括: 用户名6-12位 首字母不能是数字 只能包含字母和数字 密码6-12位 注册页两次密码是否一致 html代码: css代码: javascript代码: 注册界面html代码: 运行结果如下: 以上就是本文的全部内容,希望对

  • 1、前言 本文通过创建 provider-service、consumer-service 两个微服务,并通过 feign 接口调用来演示 Spring Cloud 整合 Consul。阅读本文需要前置知识: Spring Boot Spring Cloud Spring Cloud Feign 2、搭建 provider-service 服务 2.1、创建 maven 模块 创建provider

  • 问题内容: 通过Maven插件运行时,我试图使VertX Mertrics正常工作exec:java。 当我将应用程序打包到fatjar中并使用以下命令运行时,所有工作均按预期进行 当我运行它时,我看到: 我尝试了几种方法: 添加为编译依赖项 创建内部指标实施并通过文件进行注册(请仔细检查其是否已实际复制到 还添加为附加的classpath元素(除了上一点之外) 我已经仔细检查了ServiceLo

  • 本文向大家介绍js操作数据库实现注册和登陆的简单实例,包括了js操作数据库实现注册和登陆的简单实例的使用技巧和注意事项,需要的朋友参考一下 自从node-js出现之后,不只是java,php等后端语言可以操作数据库,进行内容的增删改查,javascript简本语言同样具备了该项技能,而且在node下,js具备了很强的操作性和代码的阅读性,让晦涩难懂的代码变得更加的清晰了,下面我简单介绍javasc

  • 问题内容: 在CXF的文档中,据说2.7.x版本要求在4.2.0版本以下的Woodstox jars在类路径中可用。 有人可以建议Woodstox的Maven依赖项与CXF一起工作吗? 主要问题是当我尝试使用cxf的客户端时,引发了异常“无法创建安全的XMLInputFactory”。根据不同的论坛(例如),可以使用“ org.apache.cxf.stax.allowInsecureParser