0
点赞
收藏
分享

微信扫一扫

代码审计-XXE代码审计之XML讲解

秀儿2020 2022-03-12 阅读 68
xmllinqc#

XML基础讲解

XML语法

1、第一行必须定义为文档声明

<?xml version='1.0' encoding="utf-8" ?>

2、xml文档中必须有且只有一个根标签

<?xml version='1.0' ?> <Users>//根标签 <User id='1'> <name>alex</name> </User> </Users>

3、属性值必须唯一,如id='1'

4、CDATA区:在该区域的数据回被原样展示

<![CDATA['数据']]]]>

5、xml实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

实体引用是对实体的引用。

实体可在内部或外部进行声明。

<<!ENTITY 实体名称 SYSTEM "URI/URL">>外部实体

<!ENTITY 实体名称 "实体的值">

XML约束

1、约束定义:规定XML文档的书写规则

2、约束的分类:

  • DTD:一种简单的约束技术

//ELEMENT定义标签,定义一个students标签,student标签下可以有多个student子标签 <!ELEMENT students (student*))> //定义一个student子标签,可以有name,age,sex标签 <!ELEMENT student (name,age,sex))> 定义name标签,值为字符串 <!ELEMENT name (#PCDATA))> <!ELEMENT name (#PCDATA))> <!ELEMENT name (#PCDATA))> //ATTLIST定义属性,定义student的属性ID为数字,且时必须的 <!ATTLIST student number ID #REQUIRED>

  • 引入DTD文档到XMl文档中,dtd文档类型有以下俩种

    • 内部dtd:将约束规则定义在xml文档中

<! DOCTYPE students[ 约束规则]>

    • 外部dtd:将约束的规则定义在外部的dtd文件中,

<!DOCTYPE studens SYSTEM "student.dtd">

    • 本地:<! DOCTYPE 根标签名 SYSTEM "dtd文件的位置">

    • 网络:<! DOCTYPE 根标签名 PUBLIC "dtd文件名" "dtd文件的URL">

XML解析讲解

1、解析:操作XML文档,将文档中的数据读取到内存中

2、操作xml文档:

  • 解析

  • 写入:将内存中的数据保存到xml文档中。持久化的存储

3、解析xml方式:

DOM:将标记语言一次性加载进内存,在内存中形成dom树

SAX:逐行读取,基于事件驱动。

Digester/JAXB:适用范围 : 有将 XML 文档直接转换为 JavaBean 需求。

XML常见解析器

1、JAXP:sun公司提供的解析器,支持dom和sax俩种解析方式

2、DOM4J:一款非常优秀的解析器

3、Jsoup:Html解析器

4、Pull:android操作系统内置的解析器。sax方式的

Jsoup解析器使用

public static void main(String[] args) throws IOException { //1、获取Document对象,根据xml文档获取 //1.1、获取xml文档的path String path = XMlXXEFormat.class.getClassLoader().getResource("student.xml").getPath(); //1.2解析xml文档,加载文档进内存,获取dom树-->Document Document document = Jsoup.parse(new File(path),"utf-8"); //1.3通过Document对象获取元素Element Elements elements = document.getElementsByTag("name"); //1.4通过Element获取元素的值 Element element = elements.get(0); System.out.println(element.text()); }

XML三种解析方式的使用

DOM 解析 XML

Java 中的 DOM 接口简介:JDK 中的 DOM API 遵循 W3C DOM 规范,其中 org.w3c.dom 包提供了 Document、DocumentType、Node、NodeList、Element 等接口, 这些接口均是访问 DOM 文档所必须的。我们可以利用这些接口创建、遍历、修改 DOM 文档。

javax.xml.parsers 包中的 DoumentBuilder 和 DocumentBuilderFactory 用于解析 XML 文档生成对应的 DOM Document 对象

javax.xml.transform.dom 和 javax.xml.transform.stream 包中 DOMSource 类和 StreamSource 类,用于将更新后的 DOM 文档写入 XML 文件

public class DOMParser { //利用newInstance方法得到创建DOM解析的工厂对象   DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();   //Load and parse XML file into DOM   public Document parse(String filePath) {      Document document = null;      try {         //DOM parser instance //调用工厂对象的newDocumentBuilder方法得到DOM解析器对象         DocumentBuilder builder = builderFactory.newDocumentBuilder();         //parse an XML file into a DOM tree //解析xml文档         document = builder.parse(new File(filePath));      } catch (ParserConfigurationException e) {         e.printStackTrace();       } catch (SAXException e) {         e.printStackTrace();      } catch (IOException e) {         e.printStackTrace();      }      return document;   }

SAX解析XMl

SAX 解析器接口和事件处理器接口定义在 org.xml.sax 包中。SAX是一行一行读取xml文件的,所以是基于事件监听器主要的接口包括 ContentHandler、DTDHandler、EntityResolver 及 ErrorHandler。其中 ContentHandler 是主要的处理器接口,用于处理基本的文档解析事件;DTDHandler 和 EntityResolver 接口用于处理与 DTD 验证和实体解析相关的事件;ErrorHandler 是基本的错误处理接口。DefaultHandler 类实现了上述四个事件处理接口。上面的例子中 BookHandler 继承了 DefaultHandler 类, 并覆盖了其中的五个回调方法 startDocument()、endDocument()、startElement()、endElement() 及 characters() 以加入自己的事件处理逻辑

1.创建一个SAXParserFactory工厂对象 SAXParserFactory factory=SAXParserFactory.newInstance(); 2.获得解析器 SAXParser parser=factory.newSAXParser(); 3.调用解析方法解析xml,这里的第一个参数可以传递文件、流、字符串、需要注意第二个参数(new DefaultHander) File file=new File("girls.xml"); //解析xml文件 parser.parse(file,new DefaultHandler());

Digester 解析 XML

// 定义要解析的 XML 的路径,并初始化工具类 File input = new File("books.xml"); Digester digester = new Digester(); //解析xml文件 Books books = (Books) digester.parse(input);

 

举报

相关推荐

0 条评论