加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – LIBXML_NOENT做了什么(为什么不称它为LIBXML_ENT)?

发布时间:2020-12-13 17:01:08 所属栏目:PHP教程 来源:网络整理
导读:在 PHP中,可以将可选参数传递给各种XML解析器,其中一个是LIBXML_NOENT. documentation有这样的说法: LIBXML_NOENT (integer) Substitute entities 替代实体的信息量不大(什么实体?什么时候替代?).但我认为,NOENT是NO_ENTITIES或NO_EXTERNAL_ENTITIES的缩
在 PHP中,可以将可选参数传递给各种XML解析器,其中一个是LIBXML_NOENT. documentation有这样的说法:

LIBXML_NOENT (integer)
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不是更合适吗?
>是否存在实际阻止解析所有实体的标志?

解决方法

问:LIBXML_NOENT标志到底有什么作用?

该标志允许替换外部或非外部的XML字符实体引用.

问:为什么称它为LIBXML_NOENT?它有什么简称,LIBXML_ENT或LIBXML_PARSE_EXTERNAL_ENTITIES不是更合适吗?

这个名字确实具有误导性.我认为NOENT只是意味着解析文档的节点树将不包含任何实体节点,因此解析器将替换实体.如果没有NOENT,解析器会为实体引用创建DOMEntityReference个节点.

问:是否存在实际阻止解析所有实体的标志?

LIBXML_NOENT允许替换所有实体引用.如果您不希望展开实体,只需省略该标志即可.例如

$xml = '<!DOCTYPE test [<!ENTITY c "TEST">]>
<test>&c;</test>';
$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->saveXML();

版画

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY c "TEST">
]>
<test>&c;</test>

似乎textContent本身替换了实体,这可能是PHP绑定的特性.如果没有LIBXML_NOENT,它会导致内部和外部实体的不同行为,因为后者不会被加载.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读