引子 

  在使用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机制的优缺点

优点

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

缺点

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

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

 

从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制的更多相关文章

  1. java中xxe漏洞修复方法

    java中禁止外部实体引用的设置方法不止一种,这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的!最早是有朋友在群里发了如下一个pdf, 而当时已经是2019年1月末了,应该不 ...

  2. ASP.NET微信支付XXE漏洞修复

    1. XXE场景 关于XML解析存在的安全问题指引 微信支付商户,最近暴露的XML外部实体注入漏洞(XML External Entity Injection,简称 XXE),该安全问题是由XML组件 ...

  3. XXE漏洞学习

    0x00 什么是XML 1.定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文 ...

  4. 浅谈XXE漏洞攻击与防御——本质上就是注入,盗取数据用

    浅谈XXE漏洞攻击与防御 from:https://thief.one/2017/06/20/1/ XML基础 在介绍xxe漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点 ...

  5. 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 ...

  6. ref:浅谈XXE漏洞攻击与防御

    ref:https://thief.one/2017/06/20/1/ 浅谈XXE漏洞攻击与防御 发表于 2017-06-20   |   分类于 web安全  |   热度 3189 ℃ 你会挽着我 ...

  7. 1.浅谈XXE漏洞攻击与防御

    XML基础 在介绍XXE漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具. XML是一种用于标记电子文 ...

  8. [WEB安全]XXE漏洞总结

    目录 0x00 XML基础 0x01 XML文档结构 0x02 DTD 0x03 实体 0x04 XXE漏洞 0x05 总结一些payload 0x06 XXE漏洞修复与防御 0x07 参考链接 0x ...

  9. XXE漏洞攻击与防御

    转自https://www.jianshu.com/p/7325b2ef8fc9 0x01 XML基础 在聊XXE之前,先说说相关的XML知识吧. 定义 XML用于标记电子文件使其具有结构性的标记语言 ...

  10. XXE漏洞介绍 & XXE漏洞攻击 & 修复建议

    介绍XXE漏洞 XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是-种允许用户对自己的标记语 ...

随机推荐

  1. Msp430 编写交通灯程序

    题目:我想想... 红灯亮,按下按键后倒计时10秒,倒计时十秒后,绿灯点亮,红灯熄灭,进入绿灯的15秒倒计时,在只剩下3秒的时候,绿灯闪烁. 代码如下,有点麻烦 当时这么写的 就不改了 #includ ...

  2. vulnhub:Victim01靶机

    kali:192.168.111.111 靶机:192.168.111.170 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --script=http-enum 192.168. ...

  3. P8201 [传智杯 #4 决赛] [yLOI2021] 生活在树上(hard version)

    个人思路: 首先,题目可以转化为是否存在 \(a,b\) 路径上一点 \(u\),满足 \(w_u = dis{1,a} \oplus dis{1,b} \oplus w_{lca(a,b)} \op ...

  4. 方法综合练习:out、params、ref

    using System; namespace ConsoleApp1 { class Program { /// <summary> /// 求两个参数之间的最大值 /// </s ...

  5. 在MyBatis-Plus整合dynamic-datasource @DS失效

    因为是事务导致的 解决方案: 1.删除事务 2.使用分布式事务 3.修改事务的传播机制 3.使用DS的本地事务 @DSTransactional 但切记不可和Spring的事务共存 附传播机制 事务传 ...

  6. python实现PDF转PNG

    说明 为了方便将pdf格式发票转为图片,找到以下方法,转换后的效果非常不错,特此记录在自己的笔记中,根据自己的需要,代码稍微有所优化修改 参考网址:https://zhuanlan.zhihu.com ...

  7. 常用的accept 属性值

    *.3gpp audio/3gpp, video/3gpp 3GPP Audio/Video *.ac3 audio/ac3 AC3 Audio *.asf allpication/vnd.ms-as ...

  8. [node]启动一个简单的node接口

    来自知乎. 需要先安装一个node,安装过程不表. 新建文件: nodeServer.js // 复制这个文件到目录,再输入一下命令: // npm i express // node nodeSer ...

  9. 访问不了github解决方案

    1.首先通过网址https://github.com.ipaddress.com/www.github.com查看当前github.com对应的IP地址,查到的信息如下图所示 修改hosts文件,wi ...

  10. Log4NET 日志分割删除与压缩解决思路(附源码)

    最近公司发现,日志产生的太多了,于是让我写个方法来解决,一开始是让我删除,后来想了想让我先压缩再删除文件夹,下面提供两个版本的源代码及简单使用. 注:这两个代码也是博主CV的网上然后修改的,如侵权,请 ...