PHP Conference Japan 2024

libxml_disable_entity_loader

(PHP 5 >= 5.2.11, PHP 7, PHP 8)

libxml_disable_entity_loader禁用加载外部实体的功能

警告

此函数已在 PHP 8.0.0 中弃用。强烈建议不要依赖此函数。

描述

#[\Deprecated]
libxml_disable_entity_loader(bool $disable = true): bool

禁用/启用加载外部实体的功能。请注意,禁用加载外部实体可能会导致加载 XML 文档的一般问题。

从 libxml 2.9.0 开始,默认情况下禁用实体替换,因此无需禁用加载外部实体,除非需要使用LIBXML_NOENTLIBXML_DTDVALIDLIBXML_DTDLOAD解析内部实体引用。通常,最好使用libxml_set_external_entity_loader()来抑制加载外部实体。LIBXML_NO_XXE常量也可用于防止这种情况(仅在 Libxml >= 2.13.0 中可用,从 PHP 8.4.0 开始)。

参数

disable

禁用 (true) 或启用 (false) libxml 扩展(例如 DOMXMLWriterXMLReader)加载外部实体。

返回值

返回先前值。

变更日志

版本 描述
8.0.0 此函数已弃用。

参见

添加注释

用户贡献的注释 6 条注释

suconghou at gmail dot com
3 年前
在 PHP 8.0 及更高版本中,PHP 使用来自 2.9.0 的 libxml 版本,libxml_disable_entity_loader 已弃用。
因此,现在可以在 php8 上安全地删除所有 `libxml_disable_entity_loader` 调用

如果您需要向后兼容性

使用此代码段

if (PHP_VERSION_ID < 80000) {
libxml_disable_entity_loader(true);
}
vavra at 602 dot cz
6 年前
如果被调用
libxml_disable_entity_loader(true);

,则会导致新的 SoapClient(.) 失败,并显示

SOAP-ERROR: Parsing WSDL: Couldn't load from 'D:\path/dm_operations.wsdl' : failed to load external entity "D:\path/dm_operations.wsdl

因为此 wsdl 将 xsd 作为另一个外部文件导入。
在 php 7.1.12、win x64 上测试。
editor at geekkb.com
1 年前
在 suconghou 2 年前发布的代码中,PHP_VERSION_ID 之前应该删除一个额外的 \。

if (PHP_VERSION_ID < 80000) {
libxml_disable_entity_loader(true);
}
phofstetter at sensational dot ch
10 年前
请注意,这也会禁用 simplexml_load_file() 中的 url 加载,以及可能处理 URL 的其他基于 libxml 的函数。
simonsimcity
12 年前
使用此函数,您可以防止易受本地和远程文件包含攻击的漏洞。

您将在以下示例中看到它,其中我加载并验证以下字符串

<!DOCTYPE scan [<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">]>
<scan>&test;</scan>

防止返回文件的一种方法是将此值设置为 0。
请仔细查看 symfony 2.0.11 的版本
brendan at bloodbone dot ws
10 年前
如果在加载 XSLTProcessor 类的 XSLT 时应用此设置,这似乎也会对 <xsl:import /> 语句产生影响。
To Top