XXE学习(二)——DTD基础

一、DTD简介

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

有了DTD文档后,xml就需按照DTD中的规范来书写

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

二、内部DTD

示例代码


 <?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>George</to>
        <from>John</from>
        <heading>Reminder</heading>
        <body>Don't forget the meeting!</body>
    </note>

三、外部DTD

  示例代码

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note> 

 

 

  其中note.dtd就是一个外部的dtd文件

四、DTD中的实体

DTD中定义的例如ELEMENT是元素,他对应着xml中的标签,DTD中还可以定义xml实体。

  1. 内部实体

    <!DOCTYPE foo [
    <!ELEMENT foo ANY >
    <!ENTITY xxe "test" >]

    ENTITY定义了一个xxe实体,这个实体的内容就是test,可以简略的理解为xxe这个实体是一个变量的作用。

    xxe可以在xml中进行引用

    引用方式: &xxe;

    这样输出的时候xxe会被test替代。

  2. 外部实体

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE foo [
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>
    <creds>
        <user>&xxe;</user>
        <pass>mypass</pass>
    </creds>

    !ENTITY xxe SYSTEM "file:///c:/test.dtd"

    这一句定义了一个外部的实体,通过file协议读取

  3. 外部实体支持的协议

   

 

 

 

 

五、通用实体&参数实体

  1. 通用实体

    上面定义的实体都是通用实体,他们的引用方式都是

    &name;

    在DTD中定义,xml标签中引用;

    <user>&name;</user>

  2. 参数实体

    (1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用 (2)只有在 DTD 文件中,参数实体的声明才能引用其他实体 (3)和通用实体一样,参数实体也可以外部引用

    示例代码:

    <!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> 
    <!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> 
    %an-element; %remote-dtd;

     

posted @ 2020-03-04 00:02  d3solate  阅读(459)  评论(0)    收藏  举报