XML 实体

实体可以简单的理解为引用数据项的方法,可以是普通的文本也可以是二进制数据。

实体可以分为通用实体和参数实体。通用实体用于XML当中,用于引用文本或者二进制数据,而参数实体只能在DTD中使用。通用实体与参数实体可以是内部实 体或者是外部实体。实体还可以分为未解析与解析的实体,不同在于解析实体是规范的XML文本,而未解析的实体是不应该被解析器解析的二进制数据。

3种实体可以组合出8种实体,但实际上XML只用到5种形态:
1、通用内部解析实体
2、通用外部解析实体
3、通用外部未解析实体
4、参数内部解析实体
5、参数外部解析实体

通用内部解析实体

语法:

<!ENTITY 名称 “内容”>

实例:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
	<!ELEMENT root (shop)+>
	<!ELEMENT shop (name, address, size, pic*, remark?)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT address (#PCDATA)>
	<!ELEMENT size (#PCDATA)>
	<!ELEMENT pic (#PCDATA)>
	<!ELEMENT remark (#PCDATA)>
	<!ENTITY big "旗舰店">
	<!ENTITY medium "中等">
	<!ENTITY small "小型">
]>
<root>
	<shop>
		<name>物美</name>
		<address>文一路</address>
		<size>&big;</size>
	</shop>
</root>

注意:在实体中可以嵌套,但是不能两个是个实体互相嵌套(死循环了)。

下面正确的引用:

<!ENTITY one “one”>

<!ENTITY two “&one; I am two”>

下面是不正确的引用:

<!ENTITY one “Hello &two;”>

<!ENTITY two “Hello &one”>

参数内部解析实体

参数内部实体相当于DTD代码段的声明。

实例:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
	<!ENTITY % shopattr "
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT address (#PCDATA)>
	<!ELEMENT size (#PCDATA)>
	<!ELEMENT pic (#PCDATA)>
	<!ELEMENT remark (#PCDATA)>">

	<!ELEMENT root (shop)+>
	<!ELEMENT shop (name, address, size, pic*, remark?)>
	%shopattr;	<!--使用参数实体替代-->

	<!ENTITY big "旗舰店">
	<!ENTITY medium "中等">
	<!ENTITY small "小型">
]>
<root>
	<shop>
		<name>物美</name>
		<address>文一路</address>
		<size>&big;</size>
	</shop>
</root>

通用外部解析实体

DTD中引用otherSize.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
	<!ELEMENT root (shop)+>
	<!ELEMENT shop (name, address, size, pic*, remark?)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT address (#PCDATA)>
	<!ELEMENT size (#PCDATA)>
	<!ELEMENT pic (#PCDATA)>
	<!ELEMENT remark (#PCDATA)>
	<!ENTITY big "旗舰店">
	<!ENTITY medium "中等">
	<!ENTITY small "小型">
	<!ENTITY otherSize SYSTEM "otherSize.xml">
]>
<root>
	<shop>
		<name>物美</name>
		<address>文一路</address>
		<size>&big;</size>
	</shop>
	<shop>
		<name>联华</name>
		<address>文二路</address>
		<size>&otherSize;</size>
	</shop>
</root>

otherSize.xml

<?xml version="1.0" encoding="utf-8"?>
<option>
	big too
</option>
在ie8中显示的效果:

通用外部未解析实体

通用外部未解析实体与其他的类型很相似,区别是XML处理器不会去尝试分析实体的的信息。

通用外部未解析实体的格式:

<!ENTITY 实体名 SYSTEM 二进制数据位置 NDATA 标记名称>

NOTATION指令可以将未解析的二进制实体定义为标记

<!NOTATION 标记名 SYSTEM 标记描述文字>

标记描述文字可以是:

处理现实二进制数据的应用程序

描述格式的网络文件

普通的一段描述性语言

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
	<!ELEMENT root (shop)+>
	<!ELEMENT shop (name, address, size, pic*, remark?)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT address (#PCDATA)>
	<!ELEMENT size (#PCDATA)>
	<!ELEMENT pic EMPTY>
	<!ATTLIST pic source ENTITY #REQUIRED>
	<!NOTATION JPEG SYSTEM "acdsee.exe">
	<!ENTITY pic1 SYSTEM "pic1.jpg" NDATA JPEG>
	<!ELEMENT remark (#PCDATA)>
	<!ENTITY big "旗舰店">
	<!ENTITY medium "中等">
	<!ENTITY small "小型">
]>
<root>
	<shop>
		<name>物美</name>
		<address>文一路</address>
		<size>&big;</size>
		<pic source="pic1"/>
	</shop>
</root>

参数外部解析实体

使用参数外部解析实体可以方便的组织分布在各个文件中的DTD文件。作用相当的大。

示例:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ROOT [
	<!ELEMENT ROOT (A|B)*>
	<!ENTITY % A_atrr SYSTEM "A.dtd">
	<!ENTITY % B_atrr SYSTEM "B.dtd">
	%A_atrr;
	%B_atrr;
]>
<ROOT>
	<A>
		<NAME_A>
			I am A!
		</NAME_A>
	</A>
	<B>
		<NAME_B>
			I am B;
		</NAME_B>
	</B>
</ROOT>

A.dtd

<?xml version="1.0" encoding="utf-8"?>
<!ELEMENT A (NAME_A)>
<!ELEMENT NAME_A (#PCDATA)>

B.dtd

<?xml version="1.0" encoding="utf-8"?>
<!ELEMENT B (NAME_B)>
<!ELEMENT NAME_B (#PCDATA)>--------------------------------------------------------------------------来源于:http://www.cnblogs.com/ygcao/archive/2010/05/02/1726129.html

XML 实体

时间: 2024-11-04 01:33:49

XML 实体的相关文章

3. XML实体注入漏洞的利用与学习

XML实体注入漏洞的利用与学习 前言 XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发的安全问题.在XML1.0标准里,XML文档结构里定义了实体(entity)这个概念.实体可以通过预定义在文档中调用,实体的标识符可访问本地或远程内容.如果在这个过程中引入了"污染"源,在对XML文档处理后则可能导致信息泄漏等安全问题 漏洞利用 当允许引用外部实体时,通过构造恶意内容,可导

看好你的门-攻击服务端(2)-注入XML实体 窃取本地数据库配置

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1.XML注入 在我们经常开发.使用.运维的系统中,XML的使用频率是非常的高的.我们给服务器提供数据可能是XML(对用户而言不是,对系统和服务之间是),服务器返回给客户端的可能也是XML. XML的功能本身非常强大,但是很多的时候我们并没有去理解它的强大的功能,而只是当它作为常规的数据传输的载体,于是这种漏洞的产生了. 2. XML注入实体的案例 百度上好像发现了某个功能被XML注入实体

XML实体引用

在 XML 中,一些字符拥有特殊的意义. 如果你把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始. 这样会产生 XML 错误: <message>if salary < 1000 then</message> 为了避免这个错误,请用实体引用来代替 "<" 字符: <message>if salary < 1000 then</message> 注释:在 XM

XML实体注入漏洞

参考资料: XXE漏洞攻防  http://www.waitalone.cn/xxe-attack.html XXE注入攻击与防御 https://www.91ri.org/9539.html

微信支付的JAVA SDK存在漏洞,可导致商家服务器被入侵(绕过支付)XML外部实体注入防护

XML外部实体注入 例: InputStream is = Test01.class.getClassLoader().getResourceAsStream("evil.xml");//source XMLInputFactory xmlFactory = XMLInputFactory.newInstance(); XMLEventReader reader = xmlFactory.createXMLEventReader(is); //sink 如果evil.xml文件中包含如

XML引用外部实体触发XXE漏洞

先记录一道题 输入框中输入的内容会被显示到上面的区域中.查看后台源码,有这样的一个片段 function XHR() { var xhr; try {xhr = new XMLHttpRequest();} catch(e) { var IEXHRVers =["Msxml3.XMLHTTP","Msxml2.XMLHTTP","Microsoft.XMLHTTP"]; for (var i=0,len=IEXHRVers.length;i<

Pikachu-XXE(xml外部实体注入漏洞)

XXE -"xml external entity injection"既"xml外部实体注入漏洞".概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入. 具体的关于xml实体的介绍,网络上有很多,自己动手先查一下. 现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就

XML的总结学习

XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. HTML 被设计用来显示数据.  (一切都是为了数据:采集.整理.存储.传输.显示等等) XML 是独立于软件和硬件的信息传输工具 . 特点: 1.自行定义标签.   不像HTML都是定义好的! 2.自我描述性. 认知: 1.XML 用于创建新的互联网语言     a:XHTML b:用于描述可用的 Web 服务 的 WSDL c:作为手持设备的标记语言的 WAP 和 WML

XML详解:第三部分 XML解析

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4290918.html XML解析... 72 使用DOM解析XML. 73 DOM树中的节点类型... 75 文档节点Document75 元素节点Element77 文本节点Text77 属性节点Attr78 NodeList接口...