PHP SimpleXMLElement无法解析SYSTEM类型外部ENTITY实体怎么办
问题原因
- PHP的SimpleXMLElement底层依赖libxml库,默认禁用外部实体解析,这是libxml 2.9.0及以上版本的默认安全策略,目的是防范XXE(XML外部实体注入)攻击,和文件权限、脚本执行权限没有关联。
- 你当前的代码没有开启外部实体加载的配置,所以定义的SYSTEM实体不会被替换为对应文件的内容,最终输出为空。
解决方法
注意:开启外部实体解析有严重的安全风险,仅可在XML来源100%可控可信的场景下使用。
根据你的PHP版本选择对应方案即可:
通用兼容方案(支持PHP 7.0+、8.0+)
实例化SimpleXMLElement时传入LIBXML_NOENT参数开启实体解析,修改后的代码示例:
<?php $str = <<<XML <?xml version="1.0"?> <!DOCTYPE doc [ <!ENTITY e SYSTEM "/tmp/exp"> ]> <tag>&e;</tag> XML; // 传入LIBXML_NOENT参数开启外部实体解析 $xml = new SimpleXMLElement($str, LIBXML_NOENT); echo $xml; ?>
PHP 8.0以下版本兼容方案
如果你的PHP版本低于8.0,也可以提前调用libxml配置函数开启实体加载:
<?php // 开启外部实体加载,PHP8.0+已弃用该函数 libxml_disable_entity_loader(false); $str = <<<XML <?xml version="1.0"?> <!DOCTYPE doc [ <!ENTITY e SYSTEM "/tmp/exp"> ]> <tag>&e;</tag> XML; $xml = new SimpleXMLElement($str); echo $xml; ?>
内容的提问来源于stack exchange,提问作者beardeadclown
相关产品推荐
相关产品推荐

