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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 旋转编码器原理「建议收藏」

    旋转编码器原理「建议收藏」文章整理于网络:一、简介旋转变压器(resolver)是一种电磁式传感器,又称同步分解器。它是一种测量角度用的小型交流电动机,用来测量旋转物体的转轴角位移和角速度,由定子和转子组成。其中定子绕组作为变压器的原边,接受励磁电压,励磁频率通常用400、3000及5000HZ等。转子绕…

    2022年10月1日
    0
  • Python:利用python代码编程实现将视频的avi格式转换为MP4格式

    Python:利用python代码编程实现将视频的avi格式转换为MP4格式​Python:利用python代码编程实现将视频的avi格式转换为MP4格式目录利用python代码编程实现将视频的avi格式转换为MP4格式T1、ffmpeg命令在dos内实现T2、python代码编程实现利用python代码编程实现将视频的avi格式转换为MP4格式T1、ffmpeg命令在dos内实现ffmpeg-y-iF:\File_Anaconda\project_py37\RealTimeImageAnimation\output\FamilyBa_HuGe.a

    2022年10月17日
    0
  • ps快捷键常用表格[通俗易懂]

    ps快捷键常用表格[通俗易懂]ps快捷键常用表,ps快捷键大全!天下武功,唯快不破!看完这篇PS快捷键使用指南,帮你掌握最常用的32个Photoshop快捷键!注:左上为Mac快捷键,右上为PC快捷键1、Command+T:自由变形该快捷键,主要对图层进行旋转、缩放等变形调整,同时可以拖动修改图层在画面中的位置,是极为常用的功能键。2、Command+J:复制图层对图层的复制,一般的操作是通过图层菜单…

    2022年9月29日
    0
  • 3_1符合python语言变量_中国大学MOOC: 以下选项中不符合Python语言变量命名规则的是以下选项中不符合Python语言变量命名规则的是 答案:3_1…[通俗易懂]

    3_1符合python语言变量_中国大学MOOC: 以下选项中不符合Python语言变量命名规则的是以下选项中不符合Python语言变量命名规则的是 答案:3_1…[通俗易懂]劳心者治人,劳力者治於人”,孟子之,其所以驳()也。俟:农人家当睫状肌缩,悬韧带弛时,晶状体者也:前面曲率增,折光力强人生直为人观之义,是指()耳:生人之用于世与人所有之用、意义量人生直之格宜为()耳:劳、贡献宜从四方来得新时两步行要之位置。中国大学MOOC口被虫伤之者其主何护问答:焦思、惧中国大学MOOC口以下于北方经制论不正者是也:邑化率增速高中国大学MOOC口补虚药为补虚扶弱,正体气血阴阳虚…

    2022年6月10日
    40
  • c语言中的offset_c语言中/和%的区别

    c语言中的offset_c语言中/和%的区别今天看libPhenom源代码,看到他们使用的JSON解析库参考的是JanssonJSON解析库。于是就去网上查了这个库,找到了官方网站:http://www.digip.org/jansson/。找了一下发现在Github上能够下载源代码,于是下载了源代码来瞅瞅。    看了一会儿发现有一块代码一直看不明白,就比如说如下的代码:json_t*json_object(void)

    2022年8月22日
    3
  • Android adb 命令大全「建议收藏」

    Android adb 命令大全「建议收藏」转自:https://github.com/mzlogin/awesome-adbADB,即AndroidDebugBridge,它是Android开发/测试人员不可替代的强大工具,也是Android设备玩家的好玩具。持续更新中,欢迎提PR和Issue补充指正,觉得有用的可以将此GitHub仓库Star收藏备用。注:有部分命令的支持情况可能与Android…

    2022年7月14日
    14

发表回复

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

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