You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:45:03