从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制

引子

在使用Fortify扫描时代码报XML External Entity Injection,此漏洞为xml实体注入漏洞,XXE攻击可利用在处理时动态构建文档的 XML 功能。修复方案也包含了增加安全配置,使它不允许将外部实体包含在传入的 XML 文档中。

具体在修复过程中,代码在解析drools的transfer.xls时,调用代码中增加内容,包括serFeature和setAttribute

java;gutter:true; TransformerFactory factory = TransformerFactory.newInstance(); factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD,"");</p> <pre><code> </code></pre> <p><span class="code-snippet_outer">但在执行第二行,<br></span></p> <pre><code> ;gutter:true;
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");

时,抛出异常

不支持:http://javax.xml.XMLConstants/property/accessExternalDTD  at org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:571)  at XlsJava.main(XlsJava.java:10)

跟踪与定位

仔细查看代码,定义为javax.xml.transform.TransformerFactory的factory在setAttribute时却进入到了路径为org\apache\xalan\processor\TransformerFactoryImpl.class的类。

出现这个情况,因为项目中依赖了xalan的包,而在xalan包中指定了META-INF\services

从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制

因为这个设置,将完全限定名称为javax.xml.transform.TransformerFactory类的方法映射到了路径为

org.apache.xalan.processor.TransformerFactoryImpl

的类上,而在此类中经过一系列判断最终抛出异常

从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制

解决方案

解决这个问题的方法也很简单,只需要在调用此段代码的工程之下,覆盖xalan包的设置即可。具体实现为,在调用

factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");

的工程下配置META-INF/services路径,新建名称为

javax.xml.transform.TransformerFactory

的文件,其文件内容为

com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

如图

从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制

SPI机制

SPI是Service Provider Interface 的简称,即服务提供者接口的意思。上文所使用的处理方法就是SPI机制的实例。SPI自jdk1.6开始引入,此后便有了广泛的应用,最常见的就是数据库连接,JDK提供了一个java.sql.Driver接口,根据不同的数据库厂商来引入不同的JDBC驱动包,比如MySQL这些数据库驱动其实都会实现这个驱动类。SPI机制要求拓展内容需存放在resources/META-INF/services目录下,META-INF用于存储服务提供者(service provider)的配置文件,serviceloader从META-INF/services中文件查找service的实现,该文件具有与service接口相同的限定名,其内容包括实现的限定名列表。如此,serviceloader将调用META-INF/services中文件的具体实现。所以,

javax.xml.transform.TransformerFactory

类的实现,却在调用方法的时候定位到了

org.apache.xalan.processor.TransformerFactoryImpl

为什么必须是META-INF/services之下?看了源码你可能就会明白

java;gutter:true;
public final class ServiceLoader implements Iterable{
private static final String PREFIX = "META-INF/services/";
}

SPI机制的优缺点

优点

  1. 其核心思想就是解耦,让接口和实现分离开来
  2. 提高框架的扩展性,可以使框架根据实际业务情况启用扩展或替换框架组件

缺点

  1. serviceloader对实现类的加载使用的是懒加载,在使用循环遍历时,即使是不必要加载的类同样会被实例化,造成浪费
  2. serviceloader不是线程安全的

更多的关于SPI的相关内容,参考官方文档https://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html

Original: https://www.cnblogs.com/ladyM/p/16598816.html
Author: GirlsBoy
Title: 从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608518/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Netty源码分析之ChannelPipeline(五)—异常事件的传播

    ChannelHandler中异常的获取与处理是通过继承重写exceptionCaught方法来实现的,本篇文章我们对ChannelPipeline中exceptionCaught…

    Java 2023年6月9日
    072
  • Java多线程

    join()方法使用:【已经开了3个线程ABC,要求线程A在线程B的前面执行,线程B在线程C的前面执行】 https://blog.csdn.net/zds448588952/ar…

    Java 2023年6月6日
    073
  • shiro Realm体系

    shiro Realm体系 上图是整个Realm的继承和实现体系,Realm主要就是对用户的身份主体进行验证如(账号和密码),其中顶层接口为Realm Realm:主要对用户进行身…

    Java 2023年6月7日
    065
  • Spring boot 2.x 源码分析- SpringApplication 启动分析

    springboot 自动装配原理概述: 1.当启动Springboot应用程序时,会先创建 SpringApplication 对象。在对象的构造函数中会进行参数的初始化工作,最…

    Java 2023年6月5日
    084
  • 深入浅出的分析 Set集合

    作者:炸鸡可乐原文出处:www.pzblog.cn 一、摘要 关于 Set 接口,在实际开发中,其实很少用到,但是如果你出去面试,它可能依然是一个绕不开的话题。 言归正传,废话咱们…

    Java 2023年6月9日
    088
  • 小程序字节转GBK及UTF8

    前段时间在Android原生搞的BLE扫码枪又要移植到小程序上来。本以为小程序不支持BLE的,结果一搜,还真支持-_-|| 。 蓝牙部分问题不大,遇到的主要问题是, 小程序环境如何…

    Java 2023年6月15日
    076
  • SpringCloud中使用Nacos作为配置中心原理

    使用了是Nacos的自动配置依赖 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config 2.2.5.RELEASE…

    Java 2023年5月30日
    076
  • nginx Segmentation fault (core dumped)

    1,问题描述 nginx运行正常,某些时候登陆服务器 nginx -t命令,突然出现 Segmentation fault (core dumped) 2,解决步骤 对nginx进…

    Java 2023年5月30日
    076
  • 从服务间的一次调用分析整个springcloud的调用过程(二)

    先看示例代码 @RestController @RequestMapping("/students") public class StudentControll…

    Java 2023年6月7日
    071
  • AOP实现参数的判空问题

    不想每次都去判断必传的参数是否为空,写代码太繁琐了,正好最近用了AOP实现权限控制,依葫芦画瓢,现在用它实现参数的判空,至于AOP的原理之类,自己百度了解一下吧 NullDisab…

    Java 2023年6月8日
    061
  • 修改IntelliJ IDEA字体

    posted @2016-04-05 10:11 聊聊IT那些事 阅读(254 ) 评论() 编辑 Original: https://www.cnblogs.com/FCWORL…

    Java 2023年6月6日
    093
  • 利用Abot爬虫和visjs 呈现漫威宇宙

    1. 引言 最近接触Abot爬虫也有几天时间了,闲来无事打算从IMDB网站上爬取一些电影数据玩玩。正好美国队长3正在热映,打算爬取漫威近几年的电影并用vis这个JS库呈现下漫威宇宙…

    Java 2023年6月5日
    098
  • JAVA常用工具类

    java开发常用工具类 java正则表&…

    Java 2023年6月6日
    079
  • 非确定的自动机NFA确定化为DFA

    摘要: 在编译系统中,词法分析阶段是整个编译系统的基础。对于单词的识别,有限自动机FA是一种十分有效的工具。有限自动机由其映射f是否为单值而分为确定的有限自动机DFA和非确定的有限…

    Java 2023年6月7日
    056
  • Virtualbox下利用host-only连接方式实现虚拟机和物理机联网(包括wifi)

    https://blog.csdn.net/wordsin/article/details/80738262?utm_medium=distribute.pc_relevant_t…

    Java 2023年5月30日
    073
  • spring中InitializingBean的使用

    1、InitializingBean接口 InitializingBean接口中只包含一个afterPropertiesSet()方法,继承该接口的类,在初始化bean的时候都会执…

    Java 2023年6月7日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球