外部实体不在simplexml中工作

时间:2015-04-22 20:37:03

标签: php xml

我在PHP 5中使用SimpleXML解析XML并且外部实体不起作用。 XML解析,但实体只是空白。底层库是libxml2。

这是代码:

libxml_disable_entity_loader(false);
simplexml_load_file($target_file);

它按预期解析XML,但不解析外部实体,似乎忽略它们。

1 个答案:

答案 0 :(得分:3)

这是预期的行为,因为您需要告知何时加载文档以扩展(并因此删除)这些实体:

libxml_disable_entity_loader(false);
simplexml_load_file($target_file, 'SimpleXMLElement', LIBXML_NOENT);
                                                      ############

此常量也在the manual page of libxml_disable_entity_loader上交叉链接。

该函数本身仅启用或禁用默认实体加载程序。另外,需要通过基于libxml2的选项标志告知解析器,应该替换这些实体。只有这样,默认加载器(或者如果你将它设置为另一个加载器)才会启动。

Online Demo

<?php
/**
 * @link https://stackoverflow.com/a/29864193/367456
 */

$buffer = <<<XML
<?xml version="1.0"?>
 <!DOCTYPE foo [  
  <!ELEMENT foo ANY >
  <!ENTITY xxe SYSTEM "data://text/plain,test" >]><foo>&xxe;</foo>
XML;

libxml_disable_entity_loader(false);

$xml = simplexml_load_string($buffer);
$xml->asXML('php://output');

$xml = simplexml_load_string($buffer, 'SimpleXMLElement', LIBXML_NOENT);
$xml->asXML('php://output');

输出5.2.11 - 5.6.8,php7 @ 20140507 - 20150401,hhvm-3.5.0 - 3.6.1

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "data://text/plain,test">
]>
<foo>&xxe;</foo>
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "data://text/plain,test">
]>
<foo>test</foo>

XML基于XML External Entity (XXE) Processing (OWASP Wiki)上列出的漏洞利用示例,并针对您的问题进行了PHP演示修改。

比PHP版本更重要的是系统上的libxml版本和PHP中的绑定。只是说如果3v4l.org演示代码产生的印象是它在所有PHP版本中总是表现相同 - 这绝不是这种情况。

相关Q&amp; A