基礎(chǔ)知識:
## 1、xml:
XML 指可擴(kuò)展標(biāo)記語言
XML 被設(shè)計用來傳輸和存儲數(shù)據(jù)
HTML 被設(shè)計用來顯示數(shù)據(jù)
XML與HTML的主要差異:
XML不是HTML的替代。
XML和HTML為不同的目的而設(shè)計:
XML被設(shè)計為傳輸和存儲數(shù)據(jù),其焦點是數(shù)據(jù)的內(nèi)容。
HTML被設(shè)計用來顯示數(shù)據(jù),其焦點是數(shù)據(jù)的外觀。
HTML旨在顯示信息,而XML旨在傳輸信息。
一個 XML 文檔實例
XML 使用簡單的具有自我描述性的語法:
```
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
```
解釋:
第一行是 XML 聲明
```<note>``` 描述文檔的根元素
接下來 4 行描述根的 4 個子元素(to, from, heading 以及 body)
最后一行 ```</note>``` 定義根元素的結(jié)尾
XML 語法規(guī)則:
所有 XML 元素都須有關(guān)閉標(biāo)簽
XML 標(biāo)簽對大小寫敏感
XML 必須正確地嵌套
XML 必須正確地嵌套
XML 的屬性值須加引號
實體引用
在 XML 中,一些字符擁有特殊的意義。
如果你把字符 "<" 放在 XML 元素中,會發(fā)生錯誤,這是因為解析器會把它當(dāng)作新元素的開始。為了避免這個錯誤,請用實體引用來代替 "<" 字符:
```
<message>if salary < 1000 then</message>
```
在 XML 中,有 5 個預(yù)定義的實體引用:
```
< < 小于
> > 大于
& & 和號
' ' 單引號
" " 引號
```
## 2、DTD
文檔類型定義(DTD)可定義合法的XML文檔構(gòu)建模塊。它使用一系列合法的元素來定義文檔的結(jié)構(gòu)。
DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用。
01、內(nèi)部的 DOCTYPE 聲明
假如 DTD 被包含在您的 XML 源文件中,它應(yīng)當(dāng)通過下面的語法包裝在一個 DOCTYPE 聲明中:
<!DOCTYPE 根元素 [元素聲明]>
一個實例:
```
<?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 解釋如下:
!DOCTYPE note (第二行)定義此文檔是 note 類型的文檔。
!ELEMENT note (第三行)定義 note 元素有四個元素:"to、from、heading,、body"
!ELEMENT to (第四行)定義 to 元素為 "#PCDATA" 類型
!ELEMENT from (第五行)定義 from 元素為 "#PCDATA" 類型
!ELEMENT heading (第六行)定義 heading 元素為 "#PCDATA" 類型
!ELEMENT body (第七行)定義 body 元素為 "#PCDATA" 類型
02、外部文檔聲明
假如 DTD 位于 XML 源文件的外部,那么它應(yīng)通過下面的語法被封裝在一個 DOCTYPE 定義中:
```
<!DOCTYPE 根元素 SYSTEM "文件名">
```
這個 XML 文檔和上面的 XML 文檔相同,但是擁有一個外部的 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>
```
這是包含 DTD 的 "note.dtd" 文件:
```
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
```
XML 文檔構(gòu)建模塊
所有的 XML 文檔(以及 HTML 文檔)均由以下簡單的構(gòu)建模塊構(gòu)成:
元素
屬性
實體
PCDATA
CDATA
元素是 XML 以及 HTML 文檔的主要構(gòu)建模塊。
屬性可提供有關(guān)元素的額外信息。
實體是用來定義普通文本的變量。實體引用是對實體的引用。
大多數(shù)同學(xué)都了解這個 HTML 實體引用:" "。這個“無折行空格”實體在 HTML 中被用于在某個文檔中插入一個額外的空格。
當(dāng)文檔被 XML 解析器解析時,實體就會被展開。
PCDATA
PCDATA 的意思是被解析的字符數(shù)據(jù)(parsed character data)。
可把字符數(shù)據(jù)想象為 XML 元素的開始標(biāo)簽與結(jié)束標(biāo)簽之間的文本。
PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標(biāo)記。
文本中的標(biāo)簽會被當(dāng)作標(biāo)記來處理,而實體會被展開。
不過,被解析的字符數(shù)據(jù)不應(yīng)當(dāng)包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 實體來分別替換它們。
CDATA
CDATA 的意思是字符數(shù)據(jù)(character data)。
CDATA 是不會被解析器解析的文本。在這些文本中的標(biāo)簽不會被當(dāng)作標(biāo)記來對待,其中的實體也不會被展開。
以下用案例重點說明下實體:
01、一個內(nèi)部實體聲明
語法:
```
<!ENTITY 實體名稱 "實體的值">
```
例子:
DTD 例子:
```
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
```
XML 例子:
```
<author>&writer;©right;</author>
```
注釋: 一個實體由三部分構(gòu)成: 一個和號 (&), 一個實體名稱, 以及一個分號 (;)。
02、一個外部實體聲明
語法:
```
<!ENTITY 實體名稱 SYSTEM "URI/URL">
```
例子:
DTD 例子:
```
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
```
XML 例子:
```
<author>&writer;©right;</author>
```
### 3、XML Schema
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文檔的結(jié)構(gòu)。
XML Schema 語言也稱作 XML Schema 定義(XML Schema Definition,XSD)。
XML Schema 的作用是定義 XML 文檔的合法構(gòu)建模塊,類似 DTD:
定義可出現(xiàn)在文檔中的元素<br>
定義可出現(xiàn)在文檔中的屬性<br>
定義哪個元素是子元素<br>
定義子元素的次序<br>
定義子元素的數(shù)目<br>
定義元素是否為空,或者是否可包含文本<br>
定義元素和屬性的數(shù)據(jù)類型<br>
定義元素和屬性的默認(rèn)值以及固定值<br>
下面這個例子是一個名為 "note.xsd" 的 XML Schema 文件,它定義了上面那個 XML 文檔的元素:
```
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
```
note 元素是一個復(fù)合類型,因為它包含其他的子元素。其他元素 (to, from, heading, body) 是簡易類型,因為它們沒有包含其他元素。您將在下面的章節(jié)學(xué)習(xí)更多有關(guān)復(fù)合類型和簡易類型的知識。
此文件包含對 XML Schema 的引用:
```
<?xml version="1.0"?>
<note
xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
```
<schema> 元素是每一個 XML Schema 的根元素,<schema> 元素可包含屬性。一個 schema 聲明往往看上去類似這樣:
```
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
...
...
</xs:schema>
```
代碼解釋:
顯示 schema 中用到的元素和數(shù)據(jù)類型來自命名空間 "http://www.w3.org/2001/XMLSchema" 。同時它還規(guī)定了來自命名空間 "http://www.w3.org/2001/XMLSchema" 的元素和數(shù)據(jù)類型應(yīng)該使用前綴 xs:
```
xmlns:xs="http://www.w3.org/2001/XMLSchema"
```
顯示被此 schema 定義的元素 (note, to, from, heading, body) 來自命名空間: "http://www.w3school.com.cn"。
```
targetNamespace="http://www.w3school.com.cn"
```
指出默認(rèn)的命名空間是 "http://www.w3school.com.cn"。
```
xmlns="http://www.w3school.com.cn"
```
指出任何 XML 實例文檔所使用的且在此 schema 中聲明過的元素必須被命名空間限定。
```
elementFormDefault="qualified"
```
在 XML 文檔中引用 Schema:
```
<?xml version="1.0"?>
<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
```
代碼解釋:
下面的片斷:
```
xmlns="http://www.w3school.com.cn"
```
規(guī)定了默認(rèn)命名空間的聲明。此聲明會告知 schema 驗證器,在此 XML 文檔中使用的所有元素都被聲明于 "http://www.w3school.com.cn" 這個命名空間。
一旦您擁有了可用的 XML Schema 實例命名空間:
```
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
```
您就可以使用 schemaLocation 屬性了。此屬性有兩個值。第一個值是需要使用的命名空間。第二個值是供命名空間使用的 XML schema 的位置:
```
xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
```
## 注:學(xué)習(xí)XXE漏洞需要一定的xml基礎(chǔ)知識,以上摘自w3c文檔,詳細(xì)教程參考w3c
[XML教程](http://www.w3school.com.cn/xml/index.asp)
[DTD](http://www.w3school.com.cn/dtd/index.asp)
[XSD](http://www.w3school.com.cn/schema/index.asp)
[XSLT](http://www.w3school.com.cn/xsl/index.asp)
[XML DOM](http://www.w3school.com.cn/xmldom/index.asp)