在 PHP 中,可以将可选参数传递给各种 XML 解析器,其中之一是LIBXML_NOENT
. The 文档 https://secure.php.net/manual/en/libxml.constants.php对此有这样的说法:
LIBXML_NOENT(整数)
替代实体
Substitute entities
信息不是很丰富(什么实体?它们何时被替换?)。但我认为可以公平地假设NOENT
是缩写NO_ENTITIES
or NO_EXTERNAL_ENTITIES
,所以对我来说,这个标志禁用(外部)实体的解析似乎是一个合理的假设。
但这确实是not案子:
$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
.
该标志似乎对预定义实体没有任何影响,例如<
.
所以我的问题是:
- 具体是做什么的
LIBXML_NOENT
标志吗?
- 为什么叫它
LIBXML_NOENT
?它是什么缩写,不会LIBXML_ENT
or LIBXML_PARSE_EXTERNAL_ENTITIES
更适合吗?
- 是否有一个标志实际上阻止了所有实体的解析?
问:LIBXML_NOENT 标志到底有什么作用?
该标志允许替换 XML 字符实体引用,无论外部与否。
问:为什么叫LIBXML_NOENT?它是什么缩写,LIBXML_ENT 或 LIBXML_PARSE_EXTERNAL_ENTITIES 不是更合适吗?
这个名字确实有误导性。我觉得NOENT
只是意味着解析文档的节点树不会包含任何实体节点,因此解析器将替换实体。没有NOENT
,解析器创建DOM实体引用 http://php.net/manual/en/class.domentityreference.php实体引用的节点。
问:是否有一个标志实际上可以阻止解析所有实体?
LIBXML_NOENT
使得能够替代all实体参考。如果您不想扩展实体,只需省略该标志即可。例如
$xml = '<!DOCTYPE test [<!ENTITY c "TEST">]>
<test>&c;</test>';
$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->saveXML();
prints
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY c "TEST">
]>
<test>&c;</test>
看起来textContent
自行替换实体,这可能是 PHP 绑定的一个特性。没有LIBXML_NOENT
,它会导致内部和外部实体的不同行为,因为后者不会被加载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)