首页 > 其他分享 >XML外部实体注入--XML基础

XML外部实体注入--XML基础

时间:2025-01-21 13:01:46浏览次数:3  
标签:XML 实体 -- 标签 元素 DTD 外部 文档

一.XML基础

1.XML 基础概念

  1. 定义:XML 即可扩展标记语言(Extensible Markup Language),用于标记电子文件,使其具有结构性。它是一种允许用户对自己的标记语言进行定义的源语言,可用来标记数据、定义数据类型。

  2. 设计宗旨与应用:XML 的设计宗旨是传输数据,而非显示数据。在 web 中应用广泛,是各种应用程序之间数据传输最常用的格式。

  3. 与 HTML 的区别

    • HTML 用于定义数据的展示,专注于数据呈现的样子;XML 用于传输和存储数据。
    • 两者都用标签组织文本内容,但 HTML 有预定义的标签,而 XML 没有预定义标签,需自行定义。
  4. 特点

    • 设计宗旨为传输数据。
    • 标签需自行定义。
    • 具有自我描述性。
    • 是 W3C 的推荐标准。
  5. 文档结构

    • XML 声明(可选) :定义 XML 的版本和所使用的编码,如 <?xml version="1.0" encoding="UTF-8"?> ,它不属于 XML 本身的组成部分,无关闭标签。

    • DTD 文档类型定义(可选) :此部分原文未详细阐述,它主要用于定义 XML 文档的合法构建模块,可约束 XML 文档的结构和元素类型等。

    • 文档元素:包括根元素及子元素等。例如以下 XML 文档实例:

      <?xml version="1.0" encoding="UTF-8"?> <!--XML 声明-->
      <fruits>
          <fruit>这是一个香蕉</fruit>
      	<fruit color="红色">这是一个苹果。</fruit>
      </fruits>
      
      • 说明

        • 第一行是 XML 声明,定义版本为 1.0,编码为 UTF - 8 。
        • <!--XML 声明--> 为 XML 注释。
        • 第二行 <fruits> 是文档的根元素,它是所有其他元素的父元素。
        • 后续 <fruit> 等为子元素及元素结尾。
        • 整个 XML 呈现树形结构,有根节点(如 <fruits> )和子节点(如 <fruit> 等)。
  • 元素:XML 元素指从开始标签直到结束标签的部分(包括标签)。一个元素可以包含:

    • 其他元素(子元素),如 <fruits> 包含 <fruit>
    • 文本,如 <fruit>这是一个香蕉</fruit> 中的 “这是一个香蕉” 。
    • 属性,如 <fruit color="红色">这是一个苹果。</fruit> 中的 color="红色"

2.XML 语法规则

  1. XML 声明位置:XML 声明文件是可选部分,若存在需放在文档第一行。

  2. 根元素要求:XML 必须包含根元素,它是所有其他元素的父元素,如上述例子中的 <girls>

  3. 标签规则

    • 关闭标签要求:所有 XML 元素都必须有关闭标签,省略关闭标签是非法的,例如 <p>This is a paragraph</p> 。但需注意,XML 声明没有关闭标签,因为它不属于 XML 元素。
    • 大小写敏感:XML 标签对大小写敏感,标签 <Letter> 与标签 <letter> 不同,打开标签和关闭标签必须使用相同的大小写,如 <message>这是正确的。</message>
    • 正确嵌套:在 XML 中,所有元素都必须彼此正确地嵌套,如 <b><i>This text is bold and italic</i></b><i> 元素在 <b> 元素内打开,就在 <b> 元素内关闭。
    • 属性值引号:与 HTML 类似,XML 可拥有属性(名称 / 值的对),且 XML 的属性值须加引号。例如 <note date="08/08/2008"> 是正确的,而 <note date=08/08/2008> 是错误的。

3.XML 数据类型

  1. PCDATA:被解析的字符数据,其中的标签会被当作标记来处理,实体会被展开。例如在一般的 XML 文本内容中,大多属于 PCDATA 类型,标签会按 XML 语法规则解析。

  2. CDATA:不被解析的字符数据,其中的标签不会被当作标记来对待,实体也不会被展开。常用于需要包含大量特殊字符或不想让 XML 解析器处理的文本,例如在 XML 中嵌入一段 JavaScript 代码时,可使用 CDATA 部分来包裹代码,确保代码中的尖括号等特殊字符不被误解析。如:

    <![CDATA[
    function example() {
        console.log('This is a CDATA section');
    }
    ]]>
    

二.DTD

1.DTD 概述

  1. 定义

    • DTD(Document Type Definition)即文档类型定义,是用来控制文档格式规范的,由 XML 设计者或作者开发。
    • 它定义了 XML 中存在哪些标签、元素拥有哪些属性以及元素的内部结构等。
  2. DTD 实例说明

    <!ELEMENT bookstore (book)*> 
    <!-- 定义了根元素 bookstore,它可以包含零个或多个 book 元素 -->
    
    <!ELEMENT book (title, author, price)> 
    <!-- 定义了 book 元素,它包含三个子元素:title、author 和 price,且必须按此顺序出现 -->
    
    <!ELEMENT title (#PCDATA)> 
    <!-- 定义 title 元素,其内容为可解析的字符数据(PCDATA) -->
    
    <!ELEMENT author (#PCDATA)> 
    <!-- 定义 author 元素,其内容为可解析的字符数据(PCDATA) -->
    
    <!ELEMENT price (#PCDATA)> 
    <!-- 定义 price 元素,其内容为可解析的字符数据(PCDATA) -->
    
    <!ATTLIST book category CDATA "fiction"> 
    <!-- 为 book 元素定义一个名为 category 的属性,其数据类型为字符数据(CDATA),默认值为 "fiction" -->
    

2.DTD 的声明方式

  1. 内部声明 DTD

    • 内部声明必须使用 <!DOCTYPE> 元素,将 DTD 嵌入在 XML 文档内部。例如:
    <?xml version="1.0" encoding="UTF-8"?> <!--XML 声明-->
    <!DOCTYPE bookstore [
        <!ELEMENT book (title, author, price)> 
        <!ELEMENT title (#PCDATA)> 
        <!ELEMENT author (#PCDATA)>
        <!ELEMENT price (#PCDATA)> 
        <!ATTLIST book category CDATA "fiction"> 
    ]>
    <bookstore>
        <book category="science">
            <title>XML 基础教程</title>
            <author>张三</author>
            <price>30.00</price>
        </book>
        <book>
            <title>Java 编程指南</title>
            <author>李四</author>
            <price>50.00</price>
        </book>
    </bookstore>
    
    • 解释:在这个示例中,<!DOCTYPE bookstore [... ]> 部分将 DTD 定义包含在方括号内,使其成为 XML 文档的一部分,用于约束 bookstore 元素及其子元素的结构和属性。
  2. 外部引用 DTD

    • 介绍:可以从外部的 .dtd 文件中引用,这是一种常用的方式,但也可能是 XXE 漏洞产生的原因。

    • 引用格式<!DOCTYPE 根元素 SYSTEM "URL">

      <?xml version="1.0" encoding="UTF-8"?> <!--XML 声明-->
      <!DOCTYPE bookstore SYSTEM "bookstore.dtd">
      <bookstore>
          <book category="science">
              <title>XML 基础教程</title>
              <author>张三</author>
              <price>30.00</price>
          </book>
          <book>
              <title>Java 编程指南</title>
              <author>李四</author>
              <price>50.00</price>
          </book>
      </bookstore>
      
      • 解释:这里使用 <!DOCTYPE bookstore SYSTEM "bookstore.dtd"> 声明,将从指定的 bookstore.dtd 文件中获取 DTD 信息。常见的 URL 协议有多种,可根据实际情况选择不同的协议进行外部引用

        • libxml2PHPJava.Net
          filefilehttpfile
          httphttphttpshttp
          ftpftpftphttps
          phpfileftp
          compress.zlibjar
          compress.bzip2netdoc
          datamailto
          globgopher
          phar

3.DTD 实体

  • 实体的概念

    • 实体(ENTITY):如果在 XML 文档中需要频繁使用某一条数据,可以预先给这个数据起一个别名(类似于变量),作为一个 ENTITY,然后在文档中调用它。
    • 实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
    • 实体可以分为通用实体和参数实体,都可以内部声明或者外部引用。
  • 通用实体

    • 介绍:通用实体是在 DTD 中定义的一种实体类型,它允许你为一段文本内容创建一个别名,以便在 XML 文档中多次使用。

    • 语法<!ENTITY name "value">

    • 引用:在 XML 中引用通用实体时,由 &(和号)、实体名称(xxe)、;(分号)三部分组成。

    • 通用实体在 DTD 中定义,在 XML 文档中都可以使用。例如:

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE note [
          <!-- 定义通用实体 -->
          <!ENTITY companyName "ABC">
          <!-- 定义元素 note 包含一个元素 content -->
          <!ELEMENT note (content)>
          <!-- 定义元素 content 包含可解析的字符数据 -->
          <!ELEMENT content (#PCDATA)>
      ]>
      <note>
          <content>
              This note is &companyName;
          </content>
      </note>
      
    • 解释

      1. DTD 部分

        • <!DOCTYPE note [... ]>:使用 <!DOCTYPE> 开始内部声明 DTD,其中 note 是根元素。
        • <!ENTITY companyName "ABC">:定义了一个名为 companyName 的通用实体,其值为 "ABC"。这个实体可以在后续的 XML 元素中使用。
        • <!ELEMENT note (content)>:定义 note 元素,它包含一个 content 子元素。
        • <!ELEMENT content (#PCDATA)>:定义 content 元素,其内容为可解析的字符数据,即可以包含文本内容。
      2. XML 部分

        • <note> 是根元素,包含一个 <content> 子元素。
        • <content> 元素中的 &companyName; 是对之前定义的通用实体的引用。当 XML 解析器解析这个文档时,会将 &companyName; 替换为 "ABC",最终解析的内容如下:
  • 参数实体

    • 介绍:参数实体是一种只能在 DTD 中使用的实体,它的主要目的是在 DTD 中创建可重用的部分,使 DTD 的结构更加简洁和易于维护。

    • 语法<!ENTITY % name "value">

    • 引用:在 XML 中引用参数实体时,由 %(百分号)、实体名称(xxe)、;(分号)三部分组成。

    • 示例代码

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE message [
          <!-- 定义参数实体 -->
          <!ENTITY % commonElements "sender, receiver, body">
          <!-- 定义元素 message 包含参数实体所代表的元素序列 -->
          <!ELEMENT message (%commonElements;)>
          <!-- 定义元素 sender 包含可解析的字符数据 -->
          <!ELEMENT sender (#PCDATA)>
          <!-- 定义元素 receiver 包含可解析的字符数据 -->
          <!ELEMENT receiver (#PCDATA)>
          <!-- 定义元素 body 包含可解析的字符数据 -->
          <!ELEMENT body (#PCDATA)>
      ]>
      <message>
          <sender>Alice</sender>
          <receiver>Bob</receiver>
          <body>Hello, Bob! How are you today?</body>
      </message>
      
      • 解释:

        1. DTD 部分

          • <!DOCTYPE message [... ]>:使用 <!DOCTYPE> 开始内部声明 DTD,其中 message 是根元素。
          • <!ENTITY % commonElements "sender, receiver, body">:定义了一个参数实体 %commonElements;,它代表 "sender, receiver, body"
          • <!ELEMENT message (%commonElements;)> :在定义 message 元素时,使用了参数实体 %commonElements; 来表示 message 元素包含 senderreceiverbody 元素。
          • <!ELEMENT sender (#PCDATA)><!ELEMENT body (#PCDATA)>:分别定义了 senderreceiverbody 元素包含可解析的字符数据,即可以包含文本内容。
        2. XML 部分

          • <message> 是根元素,它包含了 senderreceiverbody 元素,这些元素的结构是根据 DTD 中使用参数实体所定义的。
  • 预定义实体

    • 第一种引用方法

在这里插入图片描述

第二种引用方法

  • 实体特殊符号描述
    &lt;<小于
    &gt;
    >大于
    &amp;
    &和号
    &apos;单引号
    &quot;"双引号

标签:XML,实体,--,标签,元素,DTD,外部,文档
From: https://blog.csdn.net/qq_37107430/article/details/145281387

相关文章

  • 滤波器与AI
    1.引言在现代计算机科学和人工智能(AI)技术中,滤波器(filter)是一个非常重要的概念。无论是在信号处理、图像分析还是时间序列数据的建模中,滤波器都起着至关重要的作用。它通过从原始数据中提取有用信息,去除噪声或增强特定特征,为AI系统的性能优化提供了强大的支持。1.1介绍滤......
  • 基于springboot的高校毕业生就业信息管理系统(源码+lw+部署文档+讲解等)
    背景及意义基于Java+SpringBoot的高校毕业生就业信息管理系统是一个功能强大的信息管理平台,旨在为高校的就业工作提供全面支持。该系统通过Java语言的强大功能和SpringBoot的便捷开发框架,将涵盖多个重要模块。其中包括毕业生信息管理,能详细记录毕业生的基本信息......
  • 【轻松掌握数据结构与算法】动态规划
    引言在本章中,我们将尝试解决那些使用其他技术(例如分治法和贪心法)未能得到最优解的问题。动态规划(DP)是一种简单的技术,但掌握起来可能比较困难。识别和解决DP问题的一个简单方法就是尽可能多地解决各种问题。“编程”一词与编码无关,而是源自文献,意思是填充表格,类似于线性规划。......
  • 详细介绍:使用 Axios 提交用户注册数据
    目录完整代码:1.项目背景和功能概述2.HTML结构解析3.JavaScript部分解析3.1事件监听和请求发送3.2请求成功与失败4.完整流程5.总结6.适用场景关键词:本案例展示了如何使用Axios发送POST请求,并提交用户注册所需的用户名和密码数据,完成用户注册操作......
  • 「CF1101F」Trucks and Cities
    题意描述有\(N\)座城市,第\(i\)座坐标为\(a_i\),有\(M\)辆卡车,第\(i\)辆卡车要从城市\(s_i\)前往城市\(e_i\),每单位长度耗油量为\(c_i\),可以在中途城市加满油\(r_i\)次,求让所有卡车都能到达目的地最小的油箱容积。传送门思考&做法step1先来思考暴力,二分答案......
  • 基于springboot的高考志愿智能推荐系统(源码+lw+部署文档+讲解等)
    背景及意义基于Java+SpringBoot的高考志愿智能推荐系统旨在为高考生提供科学、个性化的志愿填报辅助服务。该系统利用Java的强大编程能力和SpringBoot的便捷开发特性,能够高效实现功能。首先,它会收集考生的各项信息,如高考成绩、学科兴趣、地域偏好等。通过复杂的......
  • 【ComfyUI专栏】ComfyUI的模型管理和节点管理-Manager节点
    我们默认情况下,会发现ComfyUI无法进行节点和模型管理。需要通过插件来实现这些模型的管理。而目前开发爱好者们基于ComfyUI的本身功能做了一定的扩展,也就是Manager来进行节点管理,我们需要执行如下的命令来实现节点的复制:cd comfyui\custom_nodesgitclone https://github......
  • 已坚持11年免费,这绝对是神器!
    聊一聊又到一年春运季,每到春运或长假期间。返乡或出游的高峰,各种车票真是一票难求。这时候大家都在想尽方法,甚至彻夜不睡在等着抢票。希望今天这款软件能帮到那个正在为车票发愁的你。软件介绍bypass分流抢票这是一款免费无广适用于PC端的自动分流抢票软件。其支持全......
  • Python 中的 `selectors`:构建高效的 I/O 复用程序
    在现代编程中,高效地处理I/O操作是构建高性能应用程序的关键。无论是网络服务器、多任务文件处理还是实时数据流处理,都需要一种机制来同时监控多个I/O源,并在它们准备好时高效地处理数据。Python的selectors模块正是为了解决这一问题而设计的。它提供了一种高级的I/O......
  • 我们开发了一个强大的 shell 脚本用于收集系统内存信息
    在Linux系统管理中,监控内存使用情况至关重要。我们开发了一个强大的shell脚本用于收集系统内存信息。该脚本以/bin/bash为解释器,首先创建/var/log/meminfo_collector.log日志文件,若创建失败则记录错误并终止,以方便后续追踪调试。接着根据当前日期在/root/kylin_s......