在 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);
}
(PHP 5 >= 5.2.11, PHP 7, PHP 8)
libxml_disable_entity_loader — 禁用加载外部实体的功能
此函数已在 PHP 8.0.0 中弃用。强烈建议不要依赖此函数。
禁用/启用加载外部实体的功能。请注意,禁用加载外部实体可能会导致加载 XML 文档的一般问题。
从 libxml 2.9.0 开始,默认情况下禁用实体替换,因此无需禁用加载外部实体,除非需要使用LIBXML_NOENT
、LIBXML_DTDVALID
或LIBXML_DTDLOAD
解析内部实体引用。通常,最好使用libxml_set_external_entity_loader()来抑制加载外部实体。LIBXML_NO_XXE
常量也可用于防止这种情况(仅在 Libxml >= 2.13.0 中可用,从 PHP 8.4.0 开始)。
返回先前值。
版本 | 描述 |
---|---|
8.0.0 | 此函数已弃用。 |
LIBXML_NOENT
常量LIBXML_DTDVALID
常量LIBXML_NO_XXE
常量在 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);
}
如果被调用
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 上测试。
在 suconghou 2 年前发布的代码中,PHP_VERSION_ID 之前应该删除一个额外的 \。
if (PHP_VERSION_ID < 80000) {
libxml_disable_entity_loader(true);
}
请注意,这也会禁用 simplexml_load_file() 中的 url 加载,以及可能处理 URL 的其他基于 libxml 的函数。
使用此函数,您可以防止易受本地和远程文件包含攻击的漏洞。
您将在以下示例中看到它,其中我加载并验证以下字符串
<!DOCTYPE scan [<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">]>
<scan>&test;</scan>
防止返回文件的一种方法是将此值设置为 0。
请仔细查看 symfony 2.0.11 的版本