XML常见解析方式及XXE防御

embedded/2024/11/9 16:45:16/
xmlns="http://www.w3.org/2000/svg" style="display: none;">

1.PHP
1.1 SimpleXML
SimpleXML是PHP5后提供的一套简单易用的xml工具集,可以把xml转换成方便处理的对象,也可以组织生成xml数据。不过它不适用于包含namespace的xml,而且要保证xml格式完整(well-formed)。它提供了三个方法:simplexml_import_dom、simplexml_load_file、simplexml_load_string,函数名很直观地说明了函数的作用。三个函数都返回SimpleXMLElement对象,数据的读取/添加都是通过SimpleXMLElement操作.

simplexml_load_file:直接解析xml文件,如下例子:

<?php
if (file_exists('test.xml')){$xml = simplexml_load_file('test.xml');var_dump($xml);}
else{exit('Error.');}
?>

simplexml_load_string:解析xml数据,如下例子:

<?php
$xmlstring = <<<XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
XML;
$xml = simplexml_load_string($xmlstring);
var_dump($xml);
?>

以上两种方法对xml的解析都是存在xxe漏洞的风险,如果要防御xxe漏洞,php提供了禁止导入外部实体的方法。
libxml_disable_entity_loader:打开或关闭外部实体导入功能,如关闭需要在解析xml之前调用该函数并将参数置为:true,如下例子:

<?php
$xmlstring = <<<XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
XML;
Libxml_disable_entity_loader(true);//禁止外部实体注入
$xml = simplexml_load_string($xmlstring);
var_dump($xml);
?>

2.java
2.1 DOM
DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作,如下:

import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory;  
...DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  System.out.println("class name: " + dbf.getClass().getName());  // step 2:获得具体的dom解析器  DocumentBuilder db = dbf.newDocumentBuilder(); // step3: 解析一个xml文档,获得Document对象(根结点)  Document document = db.parse(new File("candidate.xml"));  NodeList list = document.getElementsByTagName("PERSON");

防御建议1:完全禁止DTDs,这样几乎可以完全阻止所有的xml实体攻击,如下例子:

import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory;  
...DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Try{ // 这是优先选择. 如果不允许DTDs (doctypes) ,几乎可以阻止所有的XML实体攻击String FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";dbf.setFeature(FEATURE, true);  //设置该特征如上传xml文件包含DTDs将提示报错。System.out.println("class name: " + dbf.getClass().getName());  // step 2:获得具体的dom解析器  DocumentBuilder db = dbf.newDocumentBuilder(); // step3: 解析一个xml文档,获得Document对象(根结点)  Document document = db.parse(new File("candidate.xml"));  NodeList list = document.getElementsByTagName("PERSON");}catch (ParserConfigurationException e) {// This should catch a failed setFeature featurelogger.info("ParserConfigurationException was thrown. The feature '" +FEATURE +"' is probably not supported by your XML processor.");...}...

防御建议2:如不完全禁止DTDs,可单独禁止外部实体导入,如下例子:

import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory;  
...DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  Try{// 如果不能完全禁用DTDs,最少采取以下措施FEATURE = "http://xml.org/sax/features/external-general-entities";dbf.setFeature(FEATURE, false);FEATURE = "http://xml.org/sax/features/external-parameter-entities";dbf.setFeature(FEATURE, false);// and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and 

http://www.ppmy.cn/embedded/35862.html

相关文章

学习笔记:【QC】Android Q telephony-data 模块

一、data init 流程图 主要分为3部分&#xff1a; 1.加载TelephonyProvider&#xff0c;解析apns-config.xml文件&#xff0c;调用loadApns将 xml中定义的数据&#xff0c;插入到TelephonyProvider底层的数据库中 2.初始化phone、DcTracker、TelephonyNetworkFactory、Conne…

Linux:进程概念(二.查看进程、父进程与子进程、进程状态详解)

Linux&#xff1a;进程概念&#xff08;二.查看进程、父进程与子进程、进程状态详解&#xff09; 上次讲了一下:Linux&#xff1a;冯诺依曼体系结构、操作系统、初识进程 文章目录 1.查看进程1.1准备工作1.2 指令&#xff1a;ps—显示当前系统中运行的进程信息1.3查看进程属性…

【二叉树算法题记录】最大和最小深度

最大和最小深度 104.二叉树的最大深度题目描述题目分析递归法 111.二叉树的最小深度题目描述题目分析迭代法 104.二叉树的最大深度 题目描述 给定一个二叉树root&#xff0c;返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 题目分析 …

小红书高级电商运营课,从0开始做小红书电商(18节课)

详情介绍 课程内容&#xff1a; 第1节课:学习流程以及后续实操流程注意事项,mp4 第2节课:小红书店铺类型解析以及开店细节.mp4 第3节课:小红书电商运营两种玩法之多品店铺解析,mp4 第4节课:小红书电商运营两种玩法之单品店铺解析,mp4 第5节课:选品课(多品类类目推荐).mp4 …

【XR806开发板试用】XR806与鸿蒙,创建任务,串口转发TCPServer收到的数据

很荣幸获得评测开发板的机会&#xff0c;XR806的程序资料做的还是挺不错的。 目标&#xff1a; 1、学习用鸿蒙创建2个任务&#xff1b; 2、创建TCP Server收发数据。 任务ledThread&#xff1a;LED每秒亮灭一次&#xff0c;代表程序在运行。 任务MainThread&#xff1a;创建TCP…

html实现网页插入音频

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要介绍html中 如何插入音乐和视频 视频插入 标签:<video></video> 兼容格式:mp4,因为别的浏览器都有不兼容的格式&#xff0c;唯一对mp4全都兼容。所以尽量使用mp4格式。 属性: 属性属性值…

k8s集群

Kubernetes 集群由很多节点组成&#xff0c;这些节点被分成以下两种类型&#xff1a; 主节点 &#xff0c;它承载 Kubernetes 控制和管理整个集群系统的控制面板。工作节点&#xff0c;它们运行用户实际部署的应用。 控制面板 控制面板用于控制集群并使它工作。它包含多个组件…

【C++题解】1435. 数池塘(八方向)

问题&#xff1a;1435. 数池塘&#xff08;八方向&#xff09; 类型&#xff1a;深搜 题目描述&#xff1a; 农夫约翰的农场可以表示成 NM&#xff08;1≤N,M≤100&#xff09;个方格组成的矩形。由于近日的降雨&#xff0c;在约翰农场上的不同地方形成了池塘。 每一个方格或…