Java XML XXE 底层防御

Java XML XXE 底层防御JavaXML相关API是由JAXP定义了相关的XML的通用接口,常见包括DOM/SAX/STAX/XPATH的标准APIJavax.xml.parsers ->DOM/SAXJavax.xml.stream ->STAXJavax.xml.xpath  ->XPATHJavax.xml.bind  ->JAXBjavax.xml.ws

大家好,又见面了,我是你们的朋友全栈君。

JavaXML相关API

是由JAXP定义了相关的XML的通用接口,常见包括DOM/SAX/STAX/XPATH 的标准API

Javax.xml.parsers  -> DOM/SAX

Javax.xml.stream   -> STAX

Javax.xml.xpath    -> XPATH

Javax.xml.bind     -> JAXB

javax.xml.ws       -> WS

XML解析在JDK中有两个项目

JAXWS 项目

openJDK的子项目,目录在
http://hg.openjdk.java.net/jdk8u/jdk8u/jaxws/该项目编译进jar/lib/rt.jar

主要包含 JAXB/WSweb service

如何加载哪个解析器

1.    查找jaxb.properties中定义javax.xml.bind.context.factory

2.    SPI机制查找有没有实现: META-INF/services/javax.xml.ws.spi.Provider

3.    内部实现:com.sun.xml.internal.bind.v2.ContextFactory(JAXB)、com.sun.xml.internal.ws.spi.ProviderImpl(WS)

 

JAXP 项目

openJDK的子项目,目录在http://hg.openjdk.java.net/jdk8u/jdk8u/jaxp/该项目编译进jar/lib/rt.jar

主要包含DOM/SAX/STAX/XPATH

如何确定加载哪个解析器

JAXP

1.    校验系统参数

2.    校验JRE/lib/jaxp.properties的参数

3.    SPI检查 META-INF/service/ 参数

4.    使用默认实现

 

DOM查找javax.xml.parsers.DocumentBuilderFactory,默认com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

SAX查找javax.xml.parsers.SAXParserFactor默认com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

STAX查找:javax.xml.stream.XMLInputFactory、javax.xml.stream.XMLOutputFactory默认com.sun.xml.internal.stream.XMLInputFactoryImpl、com.sun.xml.internal.stream.XMLOutputFactoryImpl

XPATH查找:javax.xml.xpath.XPathFactory默认com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl

 

除了WebService 大部分都使用JAXP的API

由于考虑到使用场景和第三方库非常多,我们可以分别对JAXP 和 JAXWS进行分别防御

如何防御XXE

常见JAXP 的XXE防御

 我们会在获取解析器的时候设置参数:

.setFeature(“http://apache.org/xml/features/disallow-doctype-decl“,true);

.setFeature(“http://xml.org/sax/features/external-general-entities“,false)

.setFeature(“http://xml.org/sax/features/external-parameter-entities“,false);

但这种防御依赖不同的第三方组件,需要对第三方组件的不同使用方式进行设置

底层XXE防御

通过前面的介绍,我们可以通过自定义设置DocumentBuilderFactory,SAXParserFactor,XMLInputFactory,XMLOutputFactory,XPathFactory

SecureSAXParserFactoryImpl.java
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl;
public class SecureSAXParserFactoryImplextends SAXParserFactoryImpl{
   private static Map<String,String> securityConfig = new HashMap<String,String>();
   static {
       securityConfig.put("SAXParserFactory.disallow-doctype-decl", "http://apache.org/xml/features/disallow-doctype-decl");
   }
   public void consolidatedSafety()throws SAXNotRecognizedException, SAXNotSupportedException,ParserConfigurationException{
       for(String key:securityConfig.keySet()){
           setFeature(securityConfig.get(key),Boolean.parseBoolean(System.getProperty(key)));
       }
   }
   public SecureSAXParserFactoryImpl() throwsSAXNotRecognizedException, SAXNotSupportedException,ParserConfigurationException{
       consolidatedSafety();
   }
}

1.  设置运行环境参数、JRE/lib/jaxp.properties、META-INF/service/ 参数 (由你的项目决定) 为SecureSAXParserFactoryImpl

2.  通过环境变量/配置文件设置feature是否打开 -DSAXParserFactory.disallow-doctype-decl=true这样的好处是不在关心开源组件,直接使用底层的JAXP, JAXWS 的控制安全调用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162507.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 最新面试题汇总(附带答案)【建议看看】

    最新面试题汇总(附带答案)【建议看看】1.性能测试关注的指标是什么?从外部看,性能测试主要关注如下三个指标:吞吐量:每秒钟系统能够处理的请求数、任务数响应时间:服务处理一个请求或一个任务的耗时错误率:一批请求中结果出错的请求所占比例从服务器的角度看,性能测试主要关注CPU、内存、服务器负载、网络、磁盘IO等。2.性能测试怎么做的?/如果你要进行性能测试,你是如何展开操作的?1.确定关键业务,关键路径;2.确定测试的关键数据。比如并发量,响应时间,循环次数等;3.准备测试环境,完成脚本录制或脚本开发;4.执行测试,观察或监控

    2022年9月27日
    0
  • 【深入Java虚拟机】之二:Class类文件结构「建议收藏」

    【深入Java虚拟机】之二:Class类文件结构「建议收藏」Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现。不仅使用Java编译器可以把Java代码编译成存储字节码的Class文件,使用JRuby等其他语言的编译器也可以把程序代码编译成Class文件,虚拟机并不关心Class的来源是什么语言,只要它符合一定的结构,就可以在Java中运行。Java语言中的各种变量、关键字和运算符的语义最终都是由多条字节码命令组合而成的,因此字节码命令所能提供的语义描述能力肯定会比Java语言本身更强大,这便为

    2022年5月5日
    38
  • 高效易用的okio(二)

    高效易用的okio(二)在上篇文章中,我们知道了一些JavaIO的概念,也了解了okio的用法,现在我们来分析一下源码Okio我们回到上篇的代码:Sourcesource=Okio.source(newFile(mPath));Stringread=Okio.buffer(source).readString(Charset.forName("utf-8"));显而易见Okio…

    2022年6月3日
    28
  • java bigdecimal除法(java加减乘除运算)

    BigDecimal bignum1 = new BigDecimal("10");  BigDecimal bignum2 = new BigDecimal("5");  BigDecimal bignum3 = null;    //加法  bignum3 =  bignum1.add(bignum2);       System.out.println("和 是:" + bignum3); …

    2022年4月14日
    289
  • js中settimeout和setInterval区别_JavaScript set

    js中settimeout和setInterval区别_JavaScript setsetTimeout描述setTimeout(code,millisec)setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式。注:调用过程中,可以使用clearTimeout(id_of_settimeout)终止参数描述code必需,要调用的函数后要执行的JavaScript代码串。millisec必需,在执行代码前需等待的毫秒数。setTimeintervalsetIn…

    2022年10月4日
    0
  • python测试系列教程——python+Selenium+chrome自动化测试框架

    python测试系列教程——python+Selenium+chrome自动化测试框架全栈工程师开发手册(作者:栾鹏)python教程全解需要的环境浏览器(Firefox/Chrome/IE..)PythonSeleniumSeleniumIDE(如果用Firefox)FireBug、FirePath(如果用Firefox)chromedriver、IEDriverServer、phantomjs.exeIDE(Pycharm/Subl…

    2022年4月29日
    86

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号