首页 > 编程语言 >从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制

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

时间:2022-08-18 15:23:04浏览次数:80  
标签:xml http xalan SPI META INF XMLConstants

引子 

  在使用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

 

标签:xml,http,xalan,SPI,META,INF,XMLConstants
From: https://www.cnblogs.com/ladyM/p/16598816.html

相关文章

  • httpreq
    const(HTTPS_POST="POST"HTTPS_GET="GET"HTTPS_PUT="PUT"HTTPS_DELETE="DELETE"HTTPS_PATCH="PATCH"HTTPS_COPY="CO......
  • sqli-labs第5关updatexml报错注入
      这里选用的是第五关进行演示,首先根据页面提示输入?id=1页面返回的都是正常,输入?id=1'时,页面报错了,        接着判断字段数,这里选择用?id=1order......
  • netty系列之:netty实现http2中的流控制
    目录简介http2中的流控制netty对http2流控制的封装Http2FlowControllerHttp2LocalFlowControllerHttp2RemoteFlowController流控制的使用总结 简介HTTP......
  • 一次http请求的过程(输入一个域名然后敲回车直至响应发生了什么)
    1.首先是DNS服务器进行域名的映射2.HTTP客户端进程在80端口发起一个到服务器的TCP连接,通过三次握手    http3TCP改用 QUIC(QUIC是一种通用、安全、多路复用......
  • SQL 解析 XML
    1.使用nodes和value解析XML<!--ItemsXmlcolumncontentsomethinglikethis--><GoodsReceiveNoteItemView><Location>KRCK</Location><ProductName>SoonHock,......
  • HTTP/3,它来了
    HTTP3.0是HTTP协议的第三个主要版本,前两个分别是HTTP1.0和HTTP2.0,但其实HTTP1.1我认为才是真正的HTTP1.0。如果你对HTTP1.1和HTTP2.0不太了解的话,可......
  • http和https
    基本概念HTTP(HyperTextTransferProtocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。简单来说就是一种发布和接收HTML页面的方法,被用于在......
  • http 请求 Cros 跨域问题记录(转)
    前言当发起请求前端所在的域名跟后端所在域名不在同一个Origin,或者前端请求了不在当前域名下的各种资源,都会有跨域问题。跨域问题主要是在资源提供方配置跨域,即后端服......
  • <摘自https://blog.csdn.net/JavaAndLI/article/details/125359786>SQL分页查询的写法
    MySQL的分页实现是使用LIMIT关键字。Oracle的分页是实现主要是基于rownum行号。SQLServer的分页主要使用的关键字是TOP。 具体用法总结如下:本文中的变量名词说明:1,......
  • HTTP请求以及缓存简介
    HTTP的定义:hypertexttransferprotocol超文本传输协议,是一个应用层的协议,是在互联网中传输数据的一个规定,是万维网中数据传输的基础报文:服务器与浏览器之间传输数据的......