脚本宝典收集整理的这篇文章主要介绍了php – LIBXML_NOENT做了什么(为什么不称它为LIBXML_ENT)?,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
替代实体的信息量不大(什么实体?什么时候替代?).但我认为,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不是更合适吗?
>是否存在实际阻止解析所有实体的标志?
该标志允许替换外部或非外部的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,它会导致内部和外部实体的不同行为,因为后者不会被加载.
以上是脚本宝典为你收集整理的php – LIBXML_NOENT做了什么(为什么不称它为LIBXML_ENT)?全部内容,希望文章能够帮你解决php – LIBXML_NOENT做了什么(为什么不称它为LIBXML_ENT)?所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。