从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制
引子
在使用Fortify扫描时代码报XML External Entity Injection,此漏洞为xml实体注入漏洞,XXE攻击可利用在处理时动态构建文档的 XML 功能。修复方案也包含了增加安全配置,使它不允许将外部实体包含在传入的 XML 文档中。
具体在修复过程中,代码在解析drools的transfer.xls时,调用代码中增加内容,包括serFeature和setAttribute
TransformerFactory factory = TransformerFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD,"");
但在执行第二行,
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

因为这个设置,将完全限定名称为javax.xml.transform.TransformerFactory类的方法映射到了路径为
org.apache.xalan.processor.TransformerFactoryImpl
的类上,而在此类中经过一系列判断最终抛出异常

解决方案
解决这个问题的方法也很简单,只需要在调用此段代码的工程之下,覆盖xalan包的设置即可。具体实现为,在调用
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
的工程下配置META-INF/services路径,新建名称为
javax.xml.transform.TransformerFactory
的文件,其文件内容为
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
如图

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之下?看了源码你可能就会明白
public final class ServiceLoader<S> implements Iterable<S>{
private static final String PREFIX = "META-INF/services/";
}
SPI机制的优缺点
优点
- 其核心思想就是解耦,让接口和实现分离开来
- 提高框架的扩展性,可以使框架根据实际业务情况启用扩展或替换框架组件
缺点
- serviceloader对实现类的加载使用的是懒加载,在使用循环遍历时,即使是不必要加载的类同样会被实例化,造成浪费
- serviceloader不是线程安全的
更多的关于SPI的相关内容,参考官方文档https://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html
从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制的更多相关文章
- java中xxe漏洞修复方法
java中禁止外部实体引用的设置方法不止一种,这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的!最早是有朋友在群里发了如下一个pdf, 而当时已经是2019年1月末了,应该不 ...
- ASP.NET微信支付XXE漏洞修复
1. XXE场景 关于XML解析存在的安全问题指引 微信支付商户,最近暴露的XML外部实体注入漏洞(XML External Entity Injection,简称 XXE),该安全问题是由XML组件 ...
- XXE漏洞学习
0x00 什么是XML 1.定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文 ...
- 浅谈XXE漏洞攻击与防御——本质上就是注入,盗取数据用
浅谈XXE漏洞攻击与防御 from:https://thief.one/2017/06/20/1/ XML基础 在介绍xxe漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点 ...
- Apache Roller 5.0.3 XXE漏洞分析
下载5.0.2的版本来分析 5.0.2的war包地址 http://archive.apache.org/dist/roller/roller-5/v5.0.2/bin/roller-weblogge ...
- ref:浅谈XXE漏洞攻击与防御
ref:https://thief.one/2017/06/20/1/ 浅谈XXE漏洞攻击与防御 发表于 2017-06-20 | 分类于 web安全 | 热度 3189 ℃ 你会挽着我 ...
- 1.浅谈XXE漏洞攻击与防御
XML基础 在介绍XXE漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具. XML是一种用于标记电子文 ...
- [WEB安全]XXE漏洞总结
目录 0x00 XML基础 0x01 XML文档结构 0x02 DTD 0x03 实体 0x04 XXE漏洞 0x05 总结一些payload 0x06 XXE漏洞修复与防御 0x07 参考链接 0x ...
- XXE漏洞攻击与防御
转自https://www.jianshu.com/p/7325b2ef8fc9 0x01 XML基础 在聊XXE之前,先说说相关的XML知识吧. 定义 XML用于标记电子文件使其具有结构性的标记语言 ...
- XXE漏洞介绍 & XXE漏洞攻击 & 修复建议
介绍XXE漏洞 XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是-种允许用户对自己的标记语 ...
随机推荐
- Ubuntu16.04系统语言设置为中文以及搜狗输入法的安装
特别声明:本文是在操作完才做的记录,不是特别详细,见谅哈! 虚拟机安装的Ubuntu16.04结果语言设置只有英文...起初没啥影响,后来发现自己的脚本注释显示全乱码,而且直接影响脚本运行(其实可能是 ...
- nodejs+koa 后台框架结构、demo学习地址
框架结构例子 https://github.com/bayi-lzp/koa-template 官网例子(有很多 示例) https://github.com/koajs/examples <K ...
- uni-app 下载文件 预览 + 保存自定义目录
作为使用uni-app的小白来说 尝试了好几种方法 终于得到了我想要的效果(如下) 1.点击下载按钮(文件 或者图片) 2.预览 :用户自定义选择查看的软件(图片在手机相册 文件用其他打开预览) ...
- ubuntu 20.04 修改静态IP和dhcp自动分配IP
一.静态分配固定IP kuaibang@k8smaster:~$ sudo nano /etc/netplan/00-installer-config.yaml # This is the netwo ...
- hadoop模板虚拟机配置
在安装好虚拟机软件后,进行IP配置 配置windows系统的ip 配置Vmware的ip 配置虚拟机的ip 首先 输入su root切换至root身份. 然后配置ip和网关 vim /etc/sysc ...
- docker容器监控系统
Cadvisor+InfluxDB+Grafana Cadvisor Cadvisor是检测单节点资源信息的工具,提供了一个http接口的查询界面,可以和其他工具整合使用,Cadvisor既可以采集宿 ...
- centos7 七步教你安装搭建 LAMP 服务
先说说LAMP是什么 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写: Linux,操作系统 Apache,网页服务器 MariaDB或MySQL,数据库管理系统(或者数 ...
- redis统计用户活跃数量
1.说明,redis 位图存储节省内存,用户id:156,1333; 如果用户登录,根据日期存储为1 setbit 20209001 156 1 ;//id为156的用户在1月1号登录了 setbit ...
- 20192305 王梓全Python程序设计实验三报告
20192305 王梓全Python程序设计实验三报告 课程:<Python程序设计> 班级: 1923 姓名: 王梓全 学号:20192305 实验教师:王志强 实验日期:2021年5月 ...
- python + appium 常用公共方法封装
appium 程序下载安装见之前的帖子:https://www.cnblogs.com/gancuimian/p/16536322.html appium 环境搭建见之前的帖子:https://www ...