XML基础知识

0x00 XML基础知识

XML主要被设计用于传输和存储数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?><!--这里是声明-->
<bookstore><!--根元素-->
<book category="CHILDREN"><!--category="CHILDREN"属性-->
<title>Harry Potter</title><!-->PCDATA:Harry Potter。-->
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
<!--XML文档中的所有文本均会被解析器解析。只有 CDATA 区段中的文本会被解析器忽略。当某个 XML 元素被解析时,其标签之间的文本也会被解析,所以PCDATA就是被解析的字符数据。-->
<![CDATA[
select id from user;
]]>
</bookstore>
  1. XML文档基于树结构,从根部开始扩展到树叶。如上示例,<?xml..>是XML声明,<bookstore>是根元素,book是bookstore的子元素,title、author、year、price是book的子元素

    image-20200831201621950

  2. XML主要包含:声明、元素、属性、注释、CDATA区、转义字符等

  3. 一个元素可以包含下级元素、文本、属性中的一种或多种。如上,title是元素book的子元素,而book元素有属性category,title也有文本harry potter

  4. XML命名空间:在XML中命名冲突可以通过名称前缀来避免。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <h:table>
    <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
    </h:tr>
    </h:table>

    <f:table>
    <f:name>African Coffee Table</f:name>
    <f:width>80</f:width>
    <f:length>120</f:length>
    </f:table>

0x01 XML DTD

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

  1. DTD分为内部文档声明、外部文档声明和公共文档声明。

  2. 内部文档声明:DTD在XML文档内部进行声明<!DOCTYPE root-element [element-declarations]>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0"?>
    <!--DTD内部声明-->
    <!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>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend</body>
    </note>

    以上DTD解析:

    • !DOCTYPE note (第二行)定义此文档是 note 类型的文档。
    • !ELEMENT note (第三行)定义 note 元素有四个元素:”to、from、heading、body”
    • *!ELEMENT to、from、heading、body (第四-七行)定义 *to、from、heading、body元素为PCDATA类型
  3. 外部文档声明:在XML文件引入一个单独的DTD文档<!DOCTYPE root-element SYSTEM “filename”>

    note.dtd
    1
    2
    3
    4
    5
    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>

    在xml引入外部note.dtd

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0"?>
    <!--外部引入DTD文档note.dtd-->
    <!DOCTYPE note SYSTEM "note.dtd">
    <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>
  4. 公共文档声明:在XML文件中引入公共的文件,其实也属于外部文档声明。

    1
    2
    3
    4
    <!--格式-->
    <!DOCTYPE 根元素名称 PUBLIC “DTD标识名” “公用DTD的URI”>
    <!--示例-->
    <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
  5. 外部引用支持的协议

    程序 协议
    libxml2 file
    http
    ftp
    PHP file
    http
    ftp
    php
    compress.zlib
    compress.bzip2
    data
    glob
    phar
    更多协议如
    https、ftps、zip、ssh2.shell、ssh2.scp等协议需要扩展支持
    JAVA file
    http
    ftp
    jar
    netdoc
    mailto
    gopher *
    .NET file
    http
    https
    ftp

0x02 DTD 实体

  1. 实体是用于定义引用普通文本或特殊字符的快捷方式的变量

  2. 实体根据数据类型分为字符实体、命名实体、参数实体,另外根据数据引用方式,也分为外部实体和内部实体。所以一个实体既是参数实体也是外部实体不难理解。

  3. 字符实体、命名实体统一为通用实体都是以一个&开始,以;结尾,通用实体可以用在XML、DTD等,示例:”&test;”。参数实体是以%开始、;结尾,参数实体只能在DTD文档中使用,示例:”%test;”

  4. 内部实体声明

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!--语法-->
    <!ENTITY entity-name "entity-value">

    <!--示例-->
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE foo [
    <!ELEMENT foo ANY >
    <!ENTITY xxe "test" >]>

    <creds>
    <user>&xxe;</user>
    <pass>mypass</pass>
    </creds>
  5. 外部实体声明,可引入本地资源[SYSTEM]和公共资源[PUBLIC]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    z<!--语法-->
    <!ENTITY entity-name SYSTEM "URI/URL">

    <!--示例-->
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE foo [
    <!ELEMENT foo ANY >
    <!ENTITY file SYSTEM "file:///etc/passwd">
    <!ENTITY taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

    <creds>
    <file>&file;</file>
    <taglib>&taglib;</taglib>
    </creds>

0x03 了解SOAP

SOAP(Simple Object Access Protocol,简单对象访问协议)是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息,简单来说SOAP 是用于访问网络服务的协议。

SOAP语法:

  • SOAP 消息必须用 XML 来编码
  • SOAP 消息必须使用 SOAP Envelope 命名空间
  • SOAP 消息必须使用 SOAP Encoding 命名空间
  • SOAP 消息不能包含 DTD 引用
  • SOAP 消息不能包含 XML 处理指令

SOAP消息基本结构

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>

SOAP故障处理soapenv或SOAP-ENV

1
2
3
4
5
6
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
...
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

0x04 了解WSDL

WSDL(Web Services Description Language,网络服务描述语言)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。

image-20200831211951566

WSDL绑定

WSDL 绑定可为 web service 定义消息格式和协议细节。runoob提供了绑定soap的例子

image-20200831212338946

所以其实 wsdl与soap的关系在于:wsdl绑定服务的时候可以设定使用的协议,协议可以是soap、http、smtp、ftp等任何一种传输协议,除此以外wsdl还可以绑定jms、ejb及local java等等,不过都是需要对binding和service元素做扩展的,而且需要扩展服务器的功能以支持这种扩展。

WSDL UDDI

UDDI(“Universal Description, Discovery and Integration”,通用描述、发现与集成服务) 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。

参考链接:

https://www.runoob.com/xml/

https://www.runoob.com/soap/

https://www.runoob.com/wsdl/

https://www.jianshu.com/p/8cd50bb9c7bd

soap和wsdl区别说明

https://blog.csdn.net/janchin/article/details/46849209

https://www.w3school.com.cn/dtd/dtd_entities.asp

https://xz.aliyun.com/t/6887