【发布时间】:2016-12-12 22:44:48
【问题描述】:
在 PHP 中,可以将可选参数传递给各种 XML 解析器,其中之一是 LIBXML_NOENT。 documentation 对此有话要说:
LIBXML_NOENT(整数)
替代实体
Substitute entities 信息量不是很大(什么实体?它们何时被替换?)。但我认为假设NOENT 是NO_ENTITIES 或NO_EXTERNAL_ENTITIES 的缩写是公平的,所以对我来说,这个标志禁用(外部)实体的解析似乎是一个公平的假设。
但确实不是这样的:
$xml = '<!DOCTYPE root [<!ENTITY c PUBLIC "bar" "/etc/passwd">]>
<test>&c;</test>';
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT);
echo $dom->textContent;
结果是回显了/etc/passwd 的内容。如果没有 LIBXML_NOENT 参数,情况并非如此。
对于非外部实体,该标志似乎没有任何作用。示例:
$xml = '<!DOCTYPE root [<!ENTITY c "TEST">]>
<test>&c;</test>';
$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->textContent;
这段代码的结果是“TEST”,有和没有LIBXML_NOENT。
该标志似乎对&lt;等预定义实体没有任何影响。
所以我的问题是:
-
LIBXML_NOENT标志具体有什么作用? - 为什么叫
LIBXML_NOENT?它的缩写是什么,LIBXML_ENT或LIBXML_PARSE_EXTERNAL_ENTITIES不是更合适吗? - 是否存在实际上阻止解析所有实体的标志?
【问题讨论】:
-
它是mapped to libxml 常量
XML_PARSE_NOENT,如果它可以为您提供任何搜索。描述的很模糊……
标签: php xml xml-parsing libxml2