【发布时间】:2022-01-03 18:53:41
【问题描述】:
<?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。
【问题讨论】:
-
尝试将
LIBXML_NOENT作为第二个参数传递给构造函数:3v4l.org/nTvDp -
@ChrisHaas 成功了,谢谢!
-
@ChrisHaas 在推荐打开该选项之前,您应该了解为什么它默认不打开:它已涉及许多安全漏洞,因此需要谨慎使用。
-
@IMSoP,我 100% 同意,但似乎这也可能是 OP 的目的。
-
@ChrisHaas 不一定;显然,我的答案中的示例是一个不切实际的严格过滤器,但关键是您可以拥有一个可以从何处加载实体的白名单 - 例如加载
/etc/passwd不太可能是合法用途
标签: php xml xml-parsing