gpt4 book ai didi

php - 外部实体在 simplexml 中不起作用

转载 作者:可可西里 更新时间:2023-10-31 23:19:33 26 4
gpt4 key购买 nike

我在 PHP 5 中使用 SimpleXML 解析 XML,但外部实体无法正常工作。 XML 解析,但实体只是空白。底层库是 libxml2。

这是代码:

libxml_disable_entity_loader(false);
simplexml_load_file($target_file);

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

最佳答案

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

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 中的绑定(bind)。只是说以防 3v4l.org 演示代码给人一种印象,即它在所有 PHP 版本中的行为始终相同 - 事实并非如此。

相关问答

关于php - 外部实体在 simplexml 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29811915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com