XML <!ENTITY e SYSTEM "/path/to/file" > 不适用于 PHP SimpleXMLElement


<?php
$str = <<<XML
<?xml version="1.0"?>
<!DOCTYPE doc [
<!ENTITY e SYSTEM "/tmp/exp">
]>
<tag>&e;</tag>
XML;
$xml = new SimpleXMLElement($str);
echo $xml;
?>

这应该打印出/tmp/exp的内容,但没有,我不明白为什么,即使当我使用sudo运行脚本或将/tmp/exp文件权限更改为777时也是如此。

默认情况下禁用加载外部实体,因为这会导致各种安全漏洞。

为了安全地启用它,您需要注册一个自定义实体加载器,它可以检查预期的实体路径并决定是否加载它们。例如,您可能允许某个特定目录中的任何文件,但不允许磁盘上的其他位置的任何文件——您可能不需要允许引用像/etc/passwd这样的系统文件。或者,您可以将提供的路径映射到系统上完全不同的位置。

然后,您还需要提供LIBXML_NOENT选项来告诉解析器通过处理程序扩展实体。

例如:

libxml_set_external_entity_loader(function($public, $system, $context) {
if ($system === '/tmp/exp') {
return fopen('/tmp/exp', 'r');
}
else {
return null;
}
});
$xml = new SimpleXMLElement($str, LIBXML_NOENT);

最新更新