XML 被设计用来传输和存储数据。
不同于HTML 被设计用来显示数据。
XML 指可扩展标记语言(eXtensible Markup Language)。
可扩展标记语言(英语:Extensible Markup Language,简称:XML)是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。
xml的标签必须自定义,但是写标签名的时候要有含义。
数据格式:
XML 不是 HTML 的替代。
XML 和 HTML 为不同的目的而设计:
XML 被设计用来传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
html标签不可以自定义,xml只能自定义
xml语法要求严格,必须是成对标签,且有个根标签
一个XML文件分为如下几部分内容:
文档声明
格式:
属性列表:
*version :版本号,必须的属性
*encoding :编码方式,默认时iso-88
*standalone :是否独立
元素
属性
注释
CDATA区、特殊字符
处理指令(processing instruction)
根节点就是其他所以节点的父级节点。
xml头声明,不强制要求,可有可无,但是建议写上,可以解决编码
所有xml都是成对标签
标签名大小写敏感
XML有5个预定义的实体字符,如下:
属性就是用来表示标签自身的一些额外信息。
一个元素可以有多个属性,它的基本格式为:
<student id="100">
<name>Tomname>
student>
<元素名 属性名1="属性值1" 属性名2="属性值2">
(1)属性值用双引号(”)或单引号(’)分隔,如果属性值中有单引号,则用双引号分隔;
(2)如果有双引号,则用单引号分隔。
那么如果属性值中既有单引号还有双引号怎么办?这种要使用实体(转义字符,类似于html中的空格符)
(3) 特定的属性名称在同一个元素标记中只能出现一次
(4)属性值不能包括<,>,&,如果一定要包含,也要使用实体
属性规则:
一个标签可以有多个属性,属性的值必须使用引号引起来;
命名规则:数字字母下划线,数字不能开头。
假如有这么一个需求,需要通过XML文件传递一幅图片,怎么做呢?其实我们看到的电脑上的所有文件,本质上都是字符串,不过它们都是特殊的二进制字符串。我们可以通过XML文件将一幅图片的二进制字符串传递过去,然后再解析成一幅图片。那么这个字符串就会包含大量的<,>,&或者“等一些特殊的不合法的字符。这时候解析引擎是会报错的。
所以,有些内容可能不想让解析引擎解析执行,而是当做原始内容处理,用于把整段文本解释为纯字符数据而不是标记。这就要用到CDATA节。
语法如下:
CDATA必须要大写。
CDATA节中可以输入任意字符(除]]>
外),但是不能嵌套!
如下例,这种情况它不会报错,而如果不包含在CDATA节中,就会报错:
<stu id="001">
<name>杨过name>
<sex>男sex>
<age>20age>
<intro>intro>
stu>
注意:一般情况 特殊字符较少时使用特殊字符, 字符多的时候用CDATA
xml是一种数据传输格式,当PHP接收到的就是一段xml的时候,我们的PHP应该怎么处理XMl的数据呢?
在PHP5版本以后,当提供了一个非常强大的类库,simpleXMl类库,专门用于实现对xml文档的解析操作。
php解析xml分为3步:
1:读取XML文档到内存;
2:形成DOM树;
3:由DOM树生产对象并返回;
simplexml_load_file('xml文件')
//simplexml_load_file 解析xml文档,返回PHP对象
代码案例:
php解析xml返回对象的值:
man as $v){
echo $v->name;
}
?>
或者
$x=simplexml_load_file('3.1xml');
$c=count($x->man);
for($i=0;$i<$c;$i++){
echo $x->man[$i]->name;
}
定义:addchile()函数给simplexml元素添加一个子元素。
语法:
addchile(name,values,ns);
// -name 必须 规定要添加子元素的名称
-value 可选 规定子元素的值
-ns 可选 规定子元素的命名空间。
实例
$x=simplexml_load_file('3.1.xml');
$man=$x->addChild('man');
$man->addChild('name','玉帝');
$man->addChild('age','999');
asXML() 函数以字符串的形式从 SimpleXMLElement 对象返回 XML 文档。
若失败,则返回 false。
$x->asXML('3.1.xml');
文档类型定义(DTD)可定义合法的XML文档构建模块
它使用一系列合法的元素来定义文档的结构
DTD可被成行地声明于XML文档中,也可作为一个外部引用。
(1)内部的DOCTYPE声明
从xml文件外部引入DTD:
DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Georgeto>
<from>Johnfrom>
<heading>Reminderheading>
<body>Don't forget the meeting!body>
note>
(2)外部文档声明
从xml文件外部引入DTD:
DTD实体:
DTD可以约束XML文档出现的各个元素,元素的名称,元素的先后顺序,属性等。。
(1)内部实体声明
(2)外部实体声明
(3)参数实体声明
规定一个默认的属性值
以下是属性类型的选项:
类型 | 描述 |
---|---|
CDATA | 值为字符数据 (character data) |
(en1|en2|…) | 此值是枚举列表中的一个值 |
ID | 值为唯一的 id |
IDREF | 值为另外一个元素的 id |
IDREFS | 值为其他 id 的列表 |
NMTOKEN | 值为合法的 XML 名称 |
NMTOKENS | 值为合法的 XML 名称的列表 |
ENTITY | 值是一个实体 |
ENTITIES | 值是一个实体列表 |
NOTATION | 此值是符号的名称 |
xml: | 值是一个预定义的 XML 值 |
XXE:XML External Entity attack(XML外部实体攻击)。其实XXE就是攻击者自定义了XML文件进行了执行,已知的最终效果就是读取系统文件或DOS攻击。。
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
<!DOCTYPE note [
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT head (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]]]>
<note>
<to>Daveto>
<from>Tomfrom>
<head>Reminderhead>
<body>You are a good manbody>
note>
回显,玩法,协议,引入
判断:包含命名实体(内部实体)的xml数据是否回显
]>
&xxe;
网页上回显“仙女”,说明网页对输入的xml数据是有结果回显的
注意:这里只能判断是否有回显
DOCTYPE ANY [
]>
<x>&xxe;x>
//xxe为变量,读取test.txt
//打印出来
//用file协议读指定路径的文件
DOCTYPE foo [
<!ELEMENT foo ANY >
]>
<x>&rabbit;x>
返回为空,说明内网中服务器上,index.php文件是存在的,也可以说8081端口是开放的,因此这里这个xxe漏洞,可以实现内网探针。
为什么这里返回为空,说明index.txt文件是存在的?因为如下测试显示,改为不存在的1132323.txt后,服务器返回一行报错信息。
上面的ip地址假设就是内网的一台服务器的ip地址。还可以进行一个端口扫描,看一下端口是否开放。