.xml外部实体引用

一、语法
XML声明:
XML声明放在XML文档的第一行
XML声明由以下几个部分组成:
version:文档符合xml1.0规范,我们学习1.0
encoding:文档字符编码,比如“GB2312”或者“UTF-8”
standalone:文档定义是否独立使用“no”为默认值表示不独立(允许使用外部声明
),yes表示独立使用(不允许使用外部声明)

<?sml version="1.0" ?>
这个就是xml的声明,声明也是处理指令,在xml中,所有的处理指令都以<?开始
,?>结束。<?后面紧跟着的是处理指令的名称。xml处理指令要求指定一个version属性。
并允许指定可选的standalone和encoding

规则:
(1)每个xml文档必须有且只有一个根元素
(2)在xml中,空格和换行都作为原始内容被处理,所以要小心
(3)命名规范:
区分大小写,P和p是两个不同的元素
不能以数字或下划线“_”开头
元素内不能包含空格
名称中间不能包含冒号(:)
XML有5个预定义的实体字符
&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ' 单引号
&quot; " 双引号
注释:
以!--开始--结束
<!--这是一个注释-->


xml组成:
<?xml version="1.0" encoding="utf-8" ?>
<元素 属性=“属性值”>标签体</元素>


二、ΧΜL引用DTD文件两种情况:

1.内部dtd将standalone设为真。

<?xml version="1.0" standalone="yes"?>     

<!DOCTYPE root [      

  <!ELEMENT root EMPTY>     

]>  

2.外部dtd将standalone设置为假

<?xml version="1.0" standalone="no"?>     

<!DOCTYPE root SYSTEM "http://www.test.org/test.dtd"> 

引用DTD文件和xml一起使用,目的是对xml格式的约束:如下引用内部DTD



编写DTD来约束xml如:

  1. <!ELEMENT root EMPTY> //EMPTY关键字表示元素是个空元素  
  2.     <!ELEMENT root ANY> //ANY关键字表示元素中可以出现任何内容,也可以为空  
  3.     //下面这个声明表示root中可以有文本,也可以是空  
  4.     <!ELEMENT root (#PCDATA)> //()表示一个分组,其中是放的允许在元素出现的内容,#PCDATA表示文本  
  5.     <!ELEMENT root (child)> //child是子元素的名称,这个声明表示root中必须且只能有一个child元素  
  6.     <!ELEMENT root (child1,child2)> //以逗号分隔,表示子元素依次出现  
  7.     <!ELEMENT root (child1|child2)> //竖线与"OR"的意思相近,表示root元素中只能出现child1或child2  
  8.     <!ELEMENT root (child?)> //root中child子元素可以出现一次,也可以不出现  
  9.     <!ELEMENT root (child+)> //root中child子元素至少出现一次  
  10.     <!ELEMENT root (child*)> //root中child子元素可以出现任意次数或不出现  
  11.     <!ELEMENT root (child,(a,b))> //()还可以嵌套,这里表示root元素中第一次子元素必须是child  
  12.     //紧接着是a或b  
  13.     <!ELEMENT root (child,(a,b)+)> //*,?,+这些量词可作用于分组,这里表示root元素中第一次子元素必须是child  
  14.     //紧接着是a或b出现一次或多次  


三、xml引用实体格式如下:
<!ENTITY 实体引用名 “引用内容”>
实体分两类:
1.一般实体(格式:&实体引用名)
2.参数实体(格式:%实体引用名)
一般实体,可以在XML文档中的任何位置出现的实体称为一般实体。实体可以声明为内部
实体还是外部实体。外部实体分SYSTEM和PUBLIC两种。
SYSTEM引用本地计算机,PUBLIC引用公共计算机,外部实体格式如下:
<!ENTITY 引用名 SYSTEM(PUBLIC) "URL地址">

在XML中,实体必须在DOCTYPE声明中声明。<!DOCTYPE [...]>声明在XML声明的后面
如:<?xml version="1.0" encoding="UTF-8">
<!DOCTYPE 根元素名 [
<!ENTITY 实体引用名 “引用内容”>
<!ENTITY 实体引用名 SYSTEM "引用内容">

]>

实例:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE root[
<!ENTITY titlue "引用字符1">
<!ENTITY titlue2 "引用字符2">
]>
<root>
<title value="&titlue;"> &titlue; </title>
<title2>
<value><a>&titlue2;</a></value>
</title2>

</root>

引用多个xml文件实例:

有one.xml文件和two.xml文件

<?xml version="1.0" encoding="GBK"?>
<root>
<项目>gbk</项目>
<时间>2018</时间>
<状态>start</状态>

</root>

<?xml version="1.0" encoding="GBK"?>
<root>
<姓名>ll</姓名>
<年龄>18</年龄>
<毕业学校>bj</毕业学校>
</root>

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE root[
<!ENTITY one SYSTEM "./one.xml">
<!ENTITY two SYSTEM "./two.xml">
]>
<root>
&one;
&two;
</root>

    注意:在引用实体时以‘&’开始‘;’结束。

参数实体:

    参数实体只能在DTD中使用,参数实体的声明格式:

  <!ENTITY % 实体名 "实体内容">

引用方式:%实体名;

注意:参数实体引用不能出现在内部DTD的标记声明内部 可以在标记声明允许出现的地方出现 对于外部DTD则没有这个限制。


### XXE漏洞原理 XML外部实体注入(XXE,XML External Entity Injection)是一种针对XML解析器的安全漏洞。当应用程序使用不受信任的数据作为输入并将其传递给XML解析器时,如果该解析器正确配置,则可能允许攻击者定义恶意的外部实体[^1]。 #### 原理概述 XML支持通过`DOCTYPE`声明来引用外部实体文件。这些外部实体可以指向本地文件系统中的资源或远程URL。一旦攻击者能够控制XML输入的内容,他们就可以利用此功能访问敏感信息、执行拒绝服务攻击甚至发起服务器端请求伪造(SSRF)攻击[^4]。 例如,以下是一个简单的XXE攻击示例: ```xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]> <foo>&xxe;</foo> ``` 上述代码尝试读取目标机器上的`/etc/passwd`文件内容,并将其嵌入到响应中返回给攻击者[^3]。 --- ### 防护措施 为了有效防止XXE攻击的发生,可以从以下几个方面入手实施防护策略: #### 1. **禁用外部实体** 大多数现代XML库都提供了选项用于关闭对外部实体的支持。这是最直接也是最重要的防御方式之一。例如,在libxml2版本2.9.0之后,默认情况下不会自动加载任何外部实体,除非显式启用这一行为[^2]。 对于Java环境下的SAXParserFactory实例化过程来说,可以通过设置特定属性来强化安全性: ```java DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); ``` 以上代码片段展示了如何通过调整工厂对象的功能特性以杜绝潜在风险点的存在。 #### 2. **升级依赖组件** 确保所使用的第三方库始终处于最新稳定状态非常重要。因为很多旧版软件可能存在已知漏洞而能及时修复的情况。比如前面提到过的libxml2项目,在其后续迭代过程中逐步增强了关于安全性的考量。 另外值得注意的是,除了单纯依靠更新之外还需要关注官方发布的补丁说明以及迁移指南等内容以便顺利完成过渡工作而不影响现有业务逻辑正常运转。 #### 3. **验证用户提交数据的有效性和合法性** 无论何时接收到来自客户端或其他不可信源发送过来的信息之前都应该先经过严格校验流程再进一步处理下去 。这不仅限于单纯的字符串匹配操作还包括但不限于长度限制检查、字符集范围界定等方面的工作。 #### 4. **采用更安全替代方案** 考虑完全放弃传统基于DOM/SAX模型的传统做法转而选用JSON等形式表达结构化的数据交换需求不失为一种可行的选择方向。毕竟后者天生不具备类似的弱点特征从而大大降低了遭受此类威胁的可能性。 --- ### 结论 综上所述,通过对XXE漏洞形成机制的理解我们可以采取多种有效的预防手段加以应对,其中包括但不限于禁用不必要的功能性模块如外部实体引用能力;定期审查维护相关技术栈保持与时俱进的态度积极拥抱新特性带来的改进成果等等。只有这样才能够最大程度保障信息系统免受知隐患侵害的同时持续提供高质量的服务体验给最终使用者群体带来价值最大化的效果体现出来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值